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

