先看一段利用指针交换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