看考题二的代码:
#include "stdio.h"
void Exchg2(int *px, int *py)
{
int tmp = *px;
*px = *py;
*py = tmp;
printf("*px = %d, *py = %d.\n", *px, *py);
}
main()
{
int a = 4;
int b = 6;
Exchg2(&a, &b);
printf("a = %d, b = %d.\n", a, b);
return(0);
}
它的输出结果是:
*px = 6, *py = 4.
a = 6, b = 4.
看函数的接口部分:Exchg2(int *px, int *py),请注意:参数px、py都是指针。
再看调用处:Exchg2(&a, &b);
它将a的地址(&a)代入到px,b的地址(&b)代入到py。同上面的值传递一样,函数调用时作了两个隐含的操作:将&a,&b的值赋值给了px、py。
px = &a;
py = &b;
我们发现,其实它与值传递并没有什么不同,只不过这里是将a、b的地址值传递给了px、py,而不是传递的a、b的内容,而(请好好地再比较比较)整个Exchg2函数调用是如下执行的:
px = &a; /* ← */
py = &b; /* ← 请注意这两行,它是调用Exchg2的隐含动作。*/
int tmp = *px;
*px = *py;
*py = tmp;
printf("*px =%d, *py = %d.\n", *px, *py);
这样,有了头两行的隐含赋值操作。我们现在已经可以看出,指针px、py的值已经分别是a、b变量的地址值了。接下来,对* px、* py的操作当然也就是对a、b变量本身的操作了。所以函数里头的交换就是对a、b值的交换了,这就是所谓的地址传递!!!!(传递a、b的地址给了px、py),你现在明白了吗?