为什么b的值在主函数中没有变化?

时间:2018-03-19 18:14:09

标签: c function

以下C程序

None

编译器输出a = 23,b = 17和c = 23,这不是我的预期。我以这种方式一步一步地集思广益:

gc.collect()

因此我预计结果为272,272和23。但编译器显示23,17,23。我花了很长时间才意识到b<< = 4从未改变主函数中b的值。请解释为什么如此,如果a和c的值没有,那么为什么b的值不会改变主函数?

1 个答案:

答案 0 :(得分:4)

在C中,所有参数都按值传递。这意味着更改函数参数的值不会反映在调用函数中。

然而,您可以通过将变量的地址传递给函数来模拟传递引用,就像使用c一样。当您在函数中取消引用指针变量时,您正在更改ctest_func指向的内容,即c。{/ p>

这就是bmain中没有变化的原因。出于同样的原因,a也不会改变。但是,a在分配给它时会在以下行中发生更改。

同样重要的是要注意a中的bcmain a相同b中的,ctest_func。您可以在任何一个中更改名称,它将以相同的方式工作。

要更改ab,您需要传递其地址,就像使用c一样。因此,请更改函数参数的类型(并取消引用以获取值):

void test_func(int *a, int *b, int *c) {
  *a ^= 5;
  *c = *a + *b;
  *b <<= 4;
}

然后调用它,传递ab的地址:

test_func(&a, &b, &c);