1.函数调用的四个过程
- 知识点1:我们一般将普通局部变量称为局部变量,还有一种局部变量称为静态局部变量。函数中的普通局部变量最后会进行内存释放,但是静态局部变量在函数结束后不会释放内存(后面再讲)
- 知识点2:函数的形式参数只能是普通局部变量,不可能是静态局部变量,所以,函数的形式参数在函数结束后,一定会被释放内存。
1、开辟内存空间:未出现函数调用,也就是没有进入函数之前,函数的形式参数并不占用内存的存储单元,发生调用时,形参才被临时分配内存单元。
2、值传递:实参可以是变量、常量、表达式,将实参对应的值传递给形参,于是形式参数在获得临时内存单元、确认变量名、确认变量存储类型的同时,也获得了变量值。
3、值返回:函数体中,程序碰到了return语句,它会将函数值返回给主调函数。
4、内存释放:结束函数调用,形式参数的临时内存单元会被释放掉。由于实参和形参的在调用过程中它们不是一个内存地址,所以它们根本不是一个变量,形参值的改变不会改变实参的值。
2.函数调用的三条件
- 条件1(函数在使用前已经被定义):定义语句写在调用语句前面,因为C语言自上而下执行,这和变量先定义后使用是一样的道理。比如:
#include <stdio.h> int getMaxDataFromTwo(int x, int y) //函数的定义写在函数的调用前面 { int z; z = x > y ? x : y; return z; } int main(int argc, char const *argv[]) { int data1; int data2; int dataMax; puts("请输入两个数"); scanf("%d %d", &data1, &data2); dataMax = getMaxDataFromTwo(data1, data2); //调用函数 printf("最大数是%d\n", dataMax); return 0; }
- 条件2(调用的是库函数):除了系统自带的库函数之外,我们自己也可以制作库函数。库函数的原理很简单,就是将函数的声明放在某个.h头文件之中,函数代码实现过程放在同名的C库之中。比如:
#include <stdio.h> //包含头文件,printf函数的声明语句就在里面 int main(int argc, char const *argv[]) { printf("最大数是%d\n", 2); //pritnf函数是库函数 return 0; }
- 条件3(使用前进行函数声明):我们可以通过函数原型式声明来完成。比如:
#include <stdio.h> int getMaxDataFromTwo(int x, int y); //这时候需要写声明:函数原型式声明 原型式声明也可以这么写:int getMaxDataFromTwo(int, int); int main(int argc, char const *argv[]) { int data1; int data2; int dataMax; puts("请输入两个数"); scanf("%d %d", &data1, &data2); dataMax = getMaxDataFromTwo(data1, data2); //调用函数 printf("最大数是%d\n", dataMax); return 0; } int getMaxDataFromTwo(int x, int y) //函数的定义写在函数的调用后面 { int z; z = x > y ? x : y; return z; }