以下C程序
None
编译器输出a = 23,b = 17和c = 23,这不是我的预期。我以这种方式一步一步地集思广益:
gc.collect()
因此我预计结果为272,272和23。但编译器显示23,17,23。我花了很长时间才意识到b<< = 4从未改变主函数中b的值。请解释为什么如此,如果a和c的值没有,那么为什么b的值不会改变主函数?
答案 0 :(得分:4)
在C中,所有参数都按值传递。这意味着更改函数参数的值不会反映在调用函数中。
然而,您可以通过将变量的地址传递给函数来模拟传递引用,就像使用c
一样。当您在函数中取消引用指针变量时,您正在更改c
中test_func
指向的内容,即c
。{/ p>
这就是b
在main
中没有变化的原因。出于同样的原因,a
也不会改变。但是,a
在分配给它时会在以下行中发生更改。
同样重要的是要注意a
中的b
,c
和main
与a
相同b
中的,c
和test_func
。您可以在任何一个中更改名称,它将以相同的方式工作。
要更改a
和b
,您需要传递其地址,就像使用c
一样。因此,请更改函数参数的类型(并取消引用以获取值):
void test_func(int *a, int *b, int *c) {
*a ^= 5;
*c = *a + *b;
*b <<= 4;
}
然后调用它,传递a
和b
的地址:
test_func(&a, &b, &c);