为何以下C语言指针代码的输出为1000而非10?
为什么这段代码的输出是1000而非10?
别着急,咱们一步步拆解这段代码里的指针操作,你就能瞬间明白原因了:
首先先把你的代码贴出来方便对照:
#include<stdio.h> int y; void main() { int x, *px, **ppx; x = 10; y = 1000; px = &x; ppx = &px; f3(ppx); printf("%d", *px); } void f3(int **pp) { *pp = &y; }
核心原因一句话总结:
f3函数修改了px指针本身的指向——让它从原本指向局部变量x,变成了指向全局变量y,所以最后*px取的是y的值1000。
逐行拆解执行流程:
- 全局变量
y先被声明,默认初始值为0,之后在主函数里被赋值为1000。 - 主函数里:
x = 10:局部变量x存储值10。px = &x:px是一个int*类型的指针,现在它被赋值为x的地址,也就是说px指向x,此时*px的结果是10。ppx = &px:ppx是一个int**类型的指针(指针的指针),它被赋值为px的地址,也就是ppx指向px这个指针本身。
- 调用
f3(ppx):把ppx的值(也就是px的地址)传给f3的参数pp(同样是int**类型)。- 在
f3函数里,*pp = &y这行是关键:*pp表示pp指向的那个变量——也就是主函数里的px指针本身!所以这行代码的意思是:把全局变量y的地址赋值给px。 - 到这里,
px的指向已经完全变了:它不再指向x,而是指向y了。
- 在
- 回到主函数执行
printf("%d", *px):此时*px是取px当前指向的变量的值,也就是y的1000,所以输出结果自然是1000。
额外补充:
如果你想让输出是10,那f3里应该修改的是px指向的变量的值,而不是px本身的指向。比如把f3改成这样:
void f3(int **pp) { **pp = 20; // 这会把x的值改成20,最后输出20 }
或者如果要修改x的值,直接传px进去也行,但这里用指针的指针就是为了修改指针本身的指向~
内容的提问来源于stack exchange,提问作者Yatendra Dubey
相关产品推荐
相关产品推荐

