先看一个我们非常熟悉的代码:
如果将代码改为下面的写法:
#include <stdio.h>
void swap(int a, int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 3, b = 5;
swap(a, b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
我们都知道,这段代码中的swap()函数并没有起作用,因为调用swap的时候使用
值传递的方式(将变量a的地址和b的地址中的值取出来传给swap()),实际上只是传递给swap()两个立即数而已,swap()将这两个立即数放到自己的栈里去操作,最终swap()执行结束后,它自己的栈也就消失了。而main函数中的a和b并不受影响。
如果将代码改为下面的写法:
#include <stdio.h>
void swap(int * a, int * b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int a = 3, b = 5;
swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
在main()函数中传给swap()是a和b的地址,这样,虽然swap()也是将a的地址和b的地址复制一份放入自己的栈里,但是swap()执行的结果为修改了这两个地址中的内容,在返回main()函数时这两个地址的内容仍是有效的。
*****************************************************************
所以,在向函数传参时,如果想在函数中修改这个参数并且在函数返回时修改仍生效,就要传入这个参数的地址。例如,传递一个int型的参数,就要传入这个i