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

C语言中为何向交换函数传地址而非值?解析swapref(&a,&b)执行逻辑

C语言中swapref(&a, &b)的执行细节与传址调用原理

为什么要传入变量的地址?

先看你代码里的swap函数(传值调用):当调用swap(a,b)时,程序会把主函数中a、b的值(10和20)复制一份,传给swap函数的形参a和b——这两个形参是完全独立于主函数变量的新变量。所以你在swap里交换的只是这两个副本的值,主函数里的原变量根本不会被改动,这就是调用完swap后,主函数的a、b还是10和20的原因。

要真正修改主函数里的变量,必须让函数能直接访问这些变量在内存中的实际位置——这就需要传递变量的地址,也就是传址调用。

swapref(&a, &b)具体执行了什么?

这一行的操作可以拆成两步:

  1. 取地址:&是C语言的取地址运算符,&a会获取主函数中变量a在内存中的地址(比如假设为0x1234);同理&b获取主函数中变量b的内存地址(比如0x1238)。
  2. 传递地址给函数:把这两个地址作为参数,传递给swapref函数的形参int *a和int *b——这里的*表示这两个形参是指针变量,它们的作用就是存储内存地址。此时swapref里的a存储的是主函数a的地址,swapref里的b存储的是主函数b的地址。

进入swapref函数后,代码里的*a和*b是解引用操作:

  • *a表示“访问指针a存储的地址对应的内存里的值”,也就是主函数里a的实际值;
  • temp2 = *a就是把主函数a的值(10)存到临时变量temp2中;
  • *a = *b是把主函数b的值(20)写入主函数a的内存地址;
  • *b = temp2是把temp2里的10写入主函数b的内存地址。

通过这一系列操作,主函数里a和b的实际值被直接交换了,这也是调用完swapref后,主函数输出的a、b变成20和10的原因。

代码运行结果验证

你的代码运行后会输出:

Before swapping the values in main a = 10, b = 20
After swapping values in function(using call by value) a = 20, b = 10
After swapping values in main(using call by value) a = 10, b = 20
After swapping values in function(using call by reference) a = 20, b = 10
After swapping values in main(using call by reference) a = 20, b = 10

能明显看到:传值调用只修改了函数内的副本,传址调用直接修改了主函数的原变量。

内容的提问来源于stack exchange,提问作者rustybladez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:27:30