【C语言进阶】:从定义、调用函数到递归与数组传参
五、函数函数是C语言程序的基本构建块它能够降低程序的耦合性关联度减少重复代码让程序模块化增强代码的复用性。1. 函数定义函数的具体实现返回值 函数名形参表 { 函数体 }返回值类型说明符如int、char等基本数据类型、构造数据类型或void空类型不需要返回任何结果用于返回函数最终结果。函数名遵循标识符的命名规则见名知意。形参表函数执行过程中需要用到的条件。形式数据类型 形参名, 数据类型 形参名...2. 函数的调用函数名实参表实参表传递给函数的具体的条件。形式值1, 值2...注意实参的个数和形参的个数必须一致实参和形参数据类型要一致或者相兼容实参和形参名字可以相同也可以不相同函数不被调用则不执行调用几次执行几次。函数名(实参表);表达式的结果是函数的返回值类型。当函数的返回值有一个明确的返回类型时必须要return如果不return系统会返回一个随机值。void返回值类型时可以不return或者直接写return ;。主调函数调用函数的函数称为主调函数如main被调函数被调用的函数3. 函数的声明声明的作用当被调函数定义在了主调函数的后边编译器报“implicit declaration”可以将该函数在主调函数前面进行声明多文件使用函数的时候需要对其声明允许其他文件调用。语法返回值 函数名形参表4. 函数的调用过程保护现场当函数要被执行调用时会将函数调用位置的下一条指令地址保存在栈空间恢复现场当被调函数执行完时通过出栈保护现场的地址决定CPU继续执行的位置在函数被调用的下一条指令位置。5. 函数的传参函数传参的过程其实是实参向形参拷贝的过程实参有实参的空间形参有形参的空间值传递值传递在被调函数中无法修改主调函数中的变量函数传参的顺序自右向左。6. 函数的递归调用递归调用函数直接或者间接的调用自己。本质循环方式。注意递归要有递归的出口否则会成为死循环。递归调用系统开销比循环大比如栈内存。示例代码//求1-n的和 int get_sum(int num) { if(1 num) { return 1; } return get_sum(num - 1) num; } //求斐波那契数 int fibonacci(int n) { if(1 n || 2 n) { return 1; } return fibonacci(n - 1) fibonacci(n - 2); } //求阶乘 int factorial(int n) { if(1 n || 0 n) { return 1; } return factorial(n - 1) * n; }7. 函数和一维整形数组传参方式//定义 返回值 函数名int 数组名[], int len { // sizeof(数组名); ----》sizeof(int *) ----8字节 函数体 } //调用 函数名(数组名, 数组长度); void print_array(int a[], int len) { // 函数体 } print_array(a, len); // 数组的数组名是数组的首元素地址注意数组作为函数参数传递时形参必须要是数组类型int a[][]中的常量可以有也可以省略。数组作为函数参数传递时本质传递的是数组首元素地址所以形参本质上是一个地址是数组的起始地址。由于数组名传参本质传递的是首地址所以必须要传递整形数组的长度。数组作为函数参数传递给被调函数后函数内部的使用方法和外面使用一样除了sizeof(数组名)。