先看一段利用指针交换a和b值得代码:
#include<stdio.h>
void swap(int* p1, int* p2);
int main()
{
int a, b;
int* pa, * pb;
printf("enter:");
scanf_s("%d%d", &a, &b);
pa = &a;
pb = &b;
printf("%d,%d\n", pa, pb);//最初pa,pb的地址
if (a < b) {
swap(pa, pb);
printf("%d,%d\n", pa, pb);//交换后pa和pb的地址
}
printf("%d,%d", a, b);
return 0;
}
void swap(int* p1, int* p2)
{
int t;
t = *p1;
*p1 = *p2;
*p2 = t;
}
结果为:
从程序的输出结果来看,a和b的值发生了交换,而pa和pb的值(地址)并未发生交换
这也间接证明了单向传递值传递方式中,形参的变化不能影响实参
执行swap函数时,首先将实参pa,pb的值传递给形参p1,p2,虚实结合后,形参p1指向a,p2指向b
执行swap结束,将*p1与*p2的值进行互换,即通过形参指针变量,改变他们所指向的变量的值(即a与b的值进行互换),函数调用结束,形参被释放。
由于pa,pb在调用swap函数前后没有改变,因此两次地址输出均相等
下面给出几种错误:
void swap(int*p1,int*p2)
{
int *t
t = p1;
p1 = p2;
p2 = t;
}
本意是想交换地址,通过改变p1和p2的指向使得实参pa和pb的指向发生改变,但由于单向传递不影响实参,pa和pb不变,所以实际上是行不通的
例如输入3,5 最终输出的还是3,5