一、函数参数
形式参数——形参
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。当函数调用完成之后,形式参数就自动销毁了。因此形式参数只在函数中有效。
实际参数——实参
真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,他们都必须有确定的值,以便把这些值传送给形参。
//判断一个数是不是素数 int is_prime(int n) {//这里的n就是形参 //2->n-1之间的数字 int j = 0; for (j = 2; j < n; j++) { if (n % j == 0) return 0; } return 1; } int main() { //100-200之间的素数 int i = 0; int count = 0; for (i = 100; i <= 200; i++) { if (is_prime(i) == 1) {//这里i是实参 count++; printf("%d ", i); } } printf("\n100-200之间有 %d 个素数\n", count); return 0; }
二、函数调用
传值调用
函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参。
//判断一个年份是否是闰年 is_leap_year(int x) { if ((0 == x % 4 && 0 != x % 100) || (0 == x % 400)) return 1; else return 0; } int main() { int y = 0; for (y = 1000; y <= 2000; y++) { if (is_leap_year(y) == 1) { printf("%d ", y); } } return 0; }
上面的代码中,x是形参y是实参,如果打印x和y的地址,可以得出他们俩的地址并不相同。
传址调用
传址调用是把函数外部创建的内存地址传递给函数参数的一种调用函数的方式;
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
//写一个函数,每调用一次这个函数,就会将num的值增加1 void Add(int* p) { (*p)++; } int main() { int num = 0; Add(&num); printf("%d\n", num); Add(&num); printf("%d\n", num); Add(&num); printf("%d\n", num); }