![](/img/trans.png)
[英]Why do we need the address-of operator (ampersand, &) when passing a variable to scanf, but not when assigning to it?
[英]Why do we need the address location of (&) when scaning input in C
我只是浏览一些C注释,我想知道您是否要这样做:
int var1 = 0;
scanf("%d", var1);
您会遇到某种问题。 就像您使用操作的地址位置来编写它一样:
int var1 = 0;
scanf("%d", &var1);
它工作得很好。
我一直给人的印象是,只使用变量名来存储值...为什么要指定地址lcoation?
scanf
函数需要知道var1
在内存中的存储位置才能对其进行修改。 如果仅将var1
传递给scanf
,则仅将var1
值压入堆栈。 你需要传递&var1
,这样的地址 var1
被压入堆栈。 完成此操作后, scanf
可以取消引用指针以修改调用函数中的变量。
因为C按值复制参数。 考虑以下(无用)功能:
void set_one(int x)
{
x = 1;
}
当您称呼为
int i = 2;
set_one(i);
那和
set_one(2);
该函数获取2
的副本,将其称为x
,然后将其覆盖为1
并返回。 原来的2
,也就是i
,没有改变。
要使此功能在远程使用,必须告诉它将结果放在何处 ,而不要在结果位置中显示当前值 :
void set_one(int *p)
{
*p = 1;
}
现在,调用set_one(&i)
告诉函数将结果存储在变量名i
指定的位置,结果该结果将被覆盖。
为什么要指定地址标记?
因为编译器不知道将值存储在哪里,这就是为什么它需要变量的地址来存储值而不是变量的原因。
因为传入C的默认参数是按值传递参数。 当您指定地址时,该地址所指向的内容将被该函数修改,并且在调用函数中可见。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.