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

C语言指针交换规则及数组传参下三类交换函数运行逻辑疑问

你的三个理解全部正确,以下是对应细节补充:

问题1说明

你的理解完全成立。C语言所有参数默认走值传递规则,数组名作为实参传入函数时会自动退化为指向数组首元素的指针,此时传给f1的x、y都是该指针的临时拷贝。函数内部仅交换了两个临时拷贝的指向,既没有修改指针指向内存的存储内容,也不可能修改外部实参的指向(数组名本身是地址常量,本身无法被赋值修改),因此外部数组完全不受影响,*arr_a输出值仍是初始的0。

问题2说明

你的理解完全正确。f2的核心操作是对传入的指针做解引用(*x、*y),直接修改指针指向内存地址存储的数值。本次调用传入的arr_a + 1、arr_b + 1分别是a数组第二个元素、b数组第二个元素的地址,函数直接交换了这两个地址的存储值,因此arr_a[1]的原值2被替换为b数组对应位置的3,打印结果为3,和f1仅修改指针本身的逻辑完全不同。

问题3说明

你的判断完全正确,最终输出确实是2。f3全程没有任何对指针解引用的写入操作,所有修改都仅针对x、y两个形参指针本身的指向:第一步读取x指向的值存入局部变量val,第二步把x的指向修改为y的指向,第三步把y的指向改为局部变量val的地址。整个过程没有修改外部数组的任何内存数据,函数退出后局部变量val也会被销毁,完全不会影响外部数据,因此*(arr_a + 1)仍然是初始的2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:48:00