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

C语言指针内存作用域疑问:为何示例代码main输出m=3、n=7

C语言指针参数问题解答

1. n值为7而非4的原因

C语言所有函数参数都是值传递,指针参数也不例外:

  • 调用F(m, &n)时,会将n的地址作为实参,拷贝一份赋值给F的形参int *b,此时b初始存储的是main中变量n的内存地址。
  • 执行a=7; *b=a;时,b仍指向n,解引用操作直接修改了n的内存值为7。
  • 后续执行b = &a;时,修改的是F函数内局部变量b自身存储的地址值,让它指向了F的局部变量a,这个修改不会影响main中的n,也不会改变之前已经写入n的7。
  • 最后*b=4修改的是局部变量a的值,和n完全无关,因此main最终读取到的n就是之前写入的7。

2. 假设验证与底层原理

你的假设不成立,核心逻辑如下:

  • 函数形参int *b本身是F函数栈帧上的局部变量,F执行完毕后栈帧被回收,b的存储空间会被释放,不可能保留到main中复用。
  • 你之所以能通过*b修改n的值,本质是初始状态下b存储的地址是n的地址,你修改的是该地址指向的内存空间,而非修改b自身的值。当你后续重新给b赋值为&a后,b和n就彻底失去关联了。
  • 底层原理:C语言不存在引用传递,所有对形参自身的赋值(比如b = &a)都只会修改局部拷贝的值,不会对实参产生任何影响;只有对指针做解引用操作、修改指针指向的内存时,才会影响对应地址的变量值。

内容的提问来源于stack exchange,提问作者Paul S-Pou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 10:42:04