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
相关产品推荐
相关产品推荐

