为何main函数中变量b的值未变化?C程序运行结果存疑
问题分析:为什么main函数中的b值未发生变化?
首先先贴出你的代码:
void test_func(int a, int b, int *c) { a ^= 5; *c = a + b; b <<= 4; } int main() { int a = 3, b = 0x011, c = 0; test_func(a, b, &c); a = (b > c)? b : c; printf ("%d %d %d",a,b,c); }
你疑惑的点非常关键,核心原因在于C语言的参数传递默认是「值传递」,我给你一步步拆解清楚:
- 当
main函数调用test_func(a, b, &c)时,程序会做这几件事:- 把
main里a的当前值(3)复制一份,传给test_func的形参a - 把
main里b的当前值(17,也就是0x011的十进制)复制一份,传给test_func的形参b - 把
main里c的内存地址复制一份,传给test_func的指针形参c
- 把
- 进入
test_func后,你对形参a、b做的所有修改(比如a ^=5、b <<=4),都是在这份临时复制的变量上操作的,和main里原来的a、b完全是两个独立的内存空间——修改副本自然不会影响原变量。 - 而对于指针参数
*c,你是直接通过地址访问并修改了main里c变量所在的内存,所以main里的c会被更新为23,这也是符合你预期的。
再对应到你的执行过程:
你在test_func里计算的b <<=4(17左移4位变成272),这个修改只作用于函数内部的形参b,main里的b还是保持最初的17不变。后续main里的a = (b > c)? b : c,因为17 < 23,所以a被赋值为23,最终输出就是23 17 23。
如果想要让main里的b也被test_func修改,你需要把b也改成指针传递,比如修改函数定义为:
void test_func(int a, int *b, int *c) { a ^= 5; *c = a + *b; *b <<= 4; }
然后main里调用时写成test_func(a, &b, &c),这样函数里对*b的修改就会直接作用于main里的b变量了。
内容的提问来源于stack exchange,提问作者holahola
相关产品推荐
相关产品推荐

