我正在维护一些由我最后工作的人编写的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?
,情况并非如此思考/冥想/评论将不胜感激。
答案 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;
}
来自你的这些变化:
pa
(指向-a)避免混淆使用a
作为主函数中的值,a
作为SetToTen()中的指针return
语句。 *a = b;
就像在纸条上的地址上画一样,与琼斯先生的房子颜色相同。
a = &b;
就像把纸条上的地址改为琼斯先生的地址;它实际上没有做任何后果。