函数的定义
1  | 返回值类型 函数名([[参数类型 参数名1],[参数类型 参数名2],···,[参数类型 参数n]])  | 
- 返回值类型:用于限定函数返回值的数据类型;
 - 函数名:表示函数的名称,该名称可以根据标识符命名规范来定义;
 - 参数类型:用于限定调用方法时传入参数的数据类型;
 - 参数名:用于接收调用方法时传入的数据;
 - return关键字:用于结束函数,并返回函数指定类型的值
 - 返回值:被return语句返回的值,该值会返回给调用者。如果函数没有返回值,则返回值类型要声明为void,此时,函数体中的return语句可以省略不写
 
函数的调用
函数在使用前必须定义或声明
先定义再调用
1  | int getLong(int num)  | 
这种方式就是先定义再使用。
先声明再调用
1  | int getLong(int num); //此处可以写为int getLong(int);  | 
这种方式就是先声明再调用。
无参函数与有参函数
无参函数:参数列表为空的函数1
2
3
4void func()
{
    //代码
}
有参函数:有参数列表的函数1
2
3
4void func(intn,  int m)
{
    //代码
}
函数的形参和实参
主调函数与被调函数之间,需要用参数来传递数据。
在定义函数时函数名后面括弧中的变量名称为“形式参数”,称为形参
在调用函数时,函数名后面括号中的变量或表达式称为“实际参数”,称为实参
关于实参与形参的一些要点
- 形参在未出现函数调用时,他们并不占用内存单元,只有在发生函数调用的时候形参才被分配内存,函数调用完成后,形参所占的内存被释放
 - 实参可以是变量,常量或者表达式
 - 在定义函数时,一定要指定形参的数据类型
 - 形参与实参的数据类型一定要可兼容
 - 在C语言中,实参与形参的数据传递是“值传递”,即单向传递,只由实参传递给形参,而不能由形参传递给实参。
 
函数的返回类型与返回值
- 函数的返回值通过函数中的return获得,如果函数的返回值为void可以不需要return语句
 - 函数return语句中的返回值数据类型应该与函数定义时相同
 - 如果函数中没有return语句,那么函数将返回一个不确定的值
 
exit函数
exit函数可以在任意位置退出整个程序1
exit(1);
函数的递归
函数的自我调用,叫做函数的递归
递归必须要有一个结束条件
递归经典案例:斐波那契数列
1  | int fib(int n)  | 
递归经典案例:汉诺塔
- 将1针上n-1个盘借助3针移动到2针上;
 - 将1针上剩下的一个盘移动到3针上;
 - 将n-1个盘从2针借助1针移动到3针上
1
2
3
4
5
6
7
8
9
10
11void hanoi(int n, int one, int two, int three)
{
if (n == 1)
printf("%d->%d\n", one, three);
else
{
hanoi(n - 1, one, three, two);
printf("%d->%d\n", one, three);
hanoi(n - 1, two, one, three);
}
} 
递归的优缺点
优点:让有些问题提供了最简单的方法
缺点:容易耗尽资源,代码难懂的难以维护