先看一段代码:
void swap(int a, int b)
{
int buf;
buf=a;
a=b;
b=buf;
}
int main()
{
int i=1,j=2;
swap(i,j);
printf("i=%d,j=%d",i,j);
return 0;
}
这个段代码是用来交换 i,j的值,但实际上,并不能交换i,j的值。i还是1,j还是2;
因为实参和形参之间传递都是单向,只能由实参传向形参。被调函数调用完之后系统为其分配的内存单元都会被释放。所以虽然将 i 和 j 的值传给了 a 和 b,但是交换的仅仅是内存单元 a 和 b 中的数据,对 i 和 j 没有任何影响。
所以想要实现两个数据的交换,需要对内存单元直接操作。例如:
void swap(int* p,int* q)
{
int buf;
buf=*p;
*p=*q;
*q=buf;
}
int main()
{
int i=1,j=2;
swap(&i,&j);
printf("i=%d,j=%d",i,j);
return 0;
}
这就实现了两个参数的交换。
此时由实参向形参传递的不是变量i和j的数据,而是变量 i 和 j 的地址。拷贝地址就可以直接对地址所指向的内存单元进行操作,即此时被调函数就可以直接对变量 i 和 j 进行操作了。当函数调用完之后,释放的是 p 和 q,不是 i 和 j。p 和 q 中存放的是 i 和 j 的地址。所以 p 和 q 被释放之后并不会影响 i 和 j 中的值。
函数参数传指针和传数据的区别:
如果希望在另外一个函数中修改本函数中变量的值,那么在调用函数时只能传递该变量的地址。如果这个变量是普通变量,那么传递它的地址就可以直接操作该变量的内存空间。



