在C中通过引用传递的微妙之处

时间:2011-12-07 16:50:57

标签: c pass-by-reference

我正在维护一些由我最后工作的人编写的C代码。关于通过引用传递的情况已经出现。这是我正在使用的缩短的,人为的例子:

static int b;

void SetToTen(int *a){
    b = 10;
    /* >>>>>>>  Need to set a equal to b on this line <<<<<<<< */
return;
}

int main{
    int a = 0;
    SetToTen(&a);
    /* Now a should be equal to 10*/
  . 
  .
  .
return 0;
}

在SetToTen函数中,我可以写:

*a = b;

OR

a = &b;

我认为这两者在功能上是等价的(对于它们中的任何一个,它将等于十。)但我的问题是:是否存在任何与另一个相关的偷偷摸摸的微妙之处?具体来说,如果我使用a =&amp; b这是否意味着如果我将来改变b,a也会改变?如果我使用* a = b?

,情况并非如此

思考/冥想/评论将不胜感激。

2 个答案:

答案 0 :(得分:5)

它们在功能上根本不相同。这段代码:

*a = b;

取消引用a并将其值设置为b的值。这段代码:

a = &b;

a 指针更改为指向 b 。如果您使用第二段代码,则不会发生任何事情,因为您按值更改了 a 指针,它实际上根本不会更改 a

答案 1 :(得分:2)

*a = b;

这是正确的。

a = &b;

这只是将地址复制到一个值中。 C语言按值传递所有参数。 (C ++具有引用的概念)如果要修改传递给函数的参数,则需要传入地址或数组,并修改地址或数组成员引用的值。

最好按如下方式声明和定义函数:

void setToTen(int *pa){
    *pa = 10;
}

来自你的这些变化:

  1. pa(指向-a)避免混淆使用a作为主函数中的值,a作为SetToTen()中的指针
  2. 如果目标是将传递地址的变量设置为10,则没有任何理由在任何地方使用b。
  3. 样式/语法:大多数C编码约定使用以小写字母开头的符号作为变量/方法,以及以大写字母开头的符号作为类型。
  4. 样式/语法:除非您尝试返回一个值(您的函数被声明为void)或者您希望在函数结束之前提前返回,否则不需要显式return语句。

  5. 类比:有两座房子:史密斯先生在115 Main St.,这是蓝色,而琼斯先生在205 Elm St.,这是绿色的。你有一张含有史密斯先生地址的纸条。

    *a = b;就像在纸条上的地址上画一样,与琼斯先生的房子颜色相同。

    a = &b;就像把纸条上的地址改为琼斯先生的地址;它实际上没有做任何后果。