1、函数的声明
// 返回值 函数名称(参数)
//return 返回值
unsigned long Fibonacci(unsigned n) {
if (n > 2)
return Fibonacci(n - 1) + Fibonacci(n - 2);
else
return 1;
}
2、main 函数
C 语言规定,main()是程序的入口函数,即所有的程序一定要包含一个main()函数。
int main(void) {
printf("Hello World\n");
return 0;//表示函数结束运行 如果main()里面省略return 0这一行,编译器会自动加上
}
3、参数的传值引用
/**
* @brief 交换参数值
*
* @param a
* @param b
*/
void swap(int a, int b)
{
//这里的参数没有传递的是值,不是指针引用
//影响不了原始变量
int t = b;
b = a;
a = t;
}
/**
* @brief 交换参数值
*
* @param a
* @param b
*/
void swap2(int *a, int *b)
{
//通过传入变量x和y的地址,函数内部就可以直接操作该地址,
//从而实现交换两个变量的值。
int t = *b;
*b = *a;
*a = t;
}
int main(int argc, char const *argv[])
{
int a = 1;
int b = 2;
swap(a, b);
printf("swap a=%d, b=%d", a, b);
swap2(&a, &b);
printf("swap2 a=%d, b=%d", a, b);
return 0;
}
4、函数指针
- 赋值方式 ```c void print(int a) { printf(“%d\n”, a); }
//返回值 (指针名称)(参数类型) = void (*print_ptr)(int) = &print;
C 语言还规定,函数名本身就是指向函数代码的指针,通过函数名就能获取函数地址。也就是说,print 和 &print是一回事。
- 函数作为参数传递
```java
int myfunc(int a){
return a+1;
}
int compute(int (*myfunc)(int), int a, int b){
return myfunc(a) + b;
}
int main(int argc, char const *argv[])
{
int a = 1;
int b = 2;
printf("函数指针=== %d", compute(&myfunc,a,b));
return 0;
}
//输出 4
5、函数原型
函数必须先声明,后使用。由于程序总是先运行main()函数,导致所有其他函数都必须在main()函数之前声明。
C 语言提供的解决方法是,只要在程序开头处给出函数原型,函数就可以先使用、后声明。
#include <stdio.h>
//声明函数原型
int twice(int);
int main(int argc, char const *argv[])
{
printf("函数原型==%d",twice(1));
return 0;
}
//使用函数原型后,可以声明在 main方法后
int twice(int num) {
return 2 * num;
}
6、exit()
exit()函数用来终止整个程序的运行。一旦执行到该函数,程序就会立即结束。该函数的原型定义在头文件stdlib.h里面。
7、extern 说明符
对于多文件的项目,源码文件会用到其他文件声明的函数。这时,当前文件里面,需要给出外部函数的原型,并用extern说明该函数的定义来自其他文件。
extern int foo(int arg1, char arg2);
// 相当于 int foo(int arg1, char arg2);
int main(void) {
int a = foo(2, 3);
// ...
return 0;
}
8、static 说明符
static用于函数内部声明变量时,表示该变量只需要初始化一次,不需要在每次调用时都进行初始化。
9、const 说明符
函数参数里面的const说明符,表示函数内部不得修改该参数变量。
10、可变参数
// ... 表示可变参数
int printf(const char* format, ...);