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)具体执行了什么?
这一行的操作可以拆成两步:
- 取地址:
&是C语言的取地址运算符,&a会获取主函数中变量a在内存中的地址(比如假设为0x1234);同理&b获取主函数中变量b的内存地址(比如0x1238)。 - 传递地址给函数:把这两个地址作为参数,传递给
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
相关产品推荐
相关产品推荐

