函数传参问题一直是一个难点,很多地方没懂会导致很多的问题,所以这里我将总结一下
函数的参数类型
函数的参数类型有:值,地址,引用
首先我们要知道在main函数里调用其他函数时,会在栈里开辟一段空间,最开始入栈的是当前代码的下一行代码的地址,然后依次是形参,函数的局部变量,函数的代码在代码段,当函数返回时,释放栈空间,最后出栈的是下一行代码的地址,又回到了main函数里函数开始的地方继续执行,很多人这个时候回提出一个问题,为什么栈里的变量释放了,函数还可以返回呢?这是因为编译器会为函数生成一个临时变量,用来存放函数的返回值,这里后面会详细讲到
1.值传递
这是实参把值传给形参,先看下一个程序
#include <stdio.h>
int fun(int a)
{
a++;
printf("a=%d\n",a);
return a;
}
int main(int argc, char const *argv[])
{
int var=5;
fun(var);
printf("var=%d\n",var);
return 0;
}
结果为
[root@localhost gongxiang]# ./a.out
a=6
var=5
这是一个很简单程序,fun函数的目的是var++,但是结果并没有让var++,而是形参a++,如果形参++,对于我们的程序是没有任何意义的,这是因为值传递时只是传递了实参的值给形参,用实参初始化形参,就相当于在调用fun函数时,首先进行的是 a=var;然后对a++,var的值当然不会有变化
2.地址传递
对于上面的程序可以改写
#include <stdio.h>
int fun(int *a)
{
(*a)++;
printf("*a=%d \n",*a);
return *a;
}
int main(int argc, char const *argv[])
{