主函数调用foo(&x, &y),为何foo函数内调用swap时传指针而非变量?
为什么在foo函数中调用swap时要传递指针而非值?
嘿,这问题问到点子上了——核心原因得从C语言的传值特性和swap函数的设计目的说起,咱们掰开揉碎了讲:
1. 先搞懂swap函数为啥要指针参数
先看swap的定义:
void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; }
这个函数的目标是真正交换两个外部变量的实际值,而不是瞎折腾副本。但C语言默认是「传值调用」——如果你给swap传普通变量(比如swap(x,y)),函数内部会复制一份x和y的值到临时变量里,你在swap里交换的只是这两个临时副本,外部的x和y半毛钱都不会变,那swap不就白写了?
所以swap特意把参数设成int*(指针),就是为了接收变量的内存地址,通过*a、*b这种解引用操作,直接去内存里修改原始变量的值,这才能真正完成交换。
2. 再看foo函数里的情况
在foo函数中,p1和p2本身就是指向main函数里x、y的指针啊!如果咱们傻呵呵地写swap(*p1, *p2),那传的是*p1和*p2的当前数值(也就是x和y的具体值),这又回到了传值调用的坑——swap内部拿到的是这两个数值的副本,交换完副本,外部的x、y根本没变化,完全达不到我们想要的交换效果。
而直接传swap(p1, p2),就是把指向x、y的指针直接递给swap的a和b,swap通过*a、*b就能直接操作x、y的内存,这才是真正的交换。
3. 举个反例更清楚
假设咱们把foo里的调用改成swap(*p1, *p2),运行代码看看结果:
- 初始x=5,y=9
- foo里
*p1 += *p2→ x变成14,y还是9 - 调用
swap(*p1, *p2):swap内部拿到14和9的副本,交换后副本变成9和14,但外部的x、y还是14和9 - 然后
*p2 *= *p1→ y变成9*14=126 - 最终输出x=14,y=126,这和原代码的预期结果(x=9,y=126)完全不一样,因为swap根本没起作用!
说白了,只有传递指针,swap才能真正触碰到main函数里的x和y,完成交换操作——这就是为啥foo里要传p1、p2而不是*p1、*p2的原因。
内容的提问来源于stack exchange,提问作者Krasnyy
相关产品推荐
相关产品推荐

