You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

主函数调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:34:19