当在C中扫描输入时,为什么我们需要(&)的地址位置

时间:2013-11-16 13:51:06

标签: c variables reference

我正在阅读一些C笔记,我想知道你是否要这样做:

int var1 = 0;
scanf("%d", var1);

你会遇到某种问题。好像你用操作的地址位置写的那样:

int var1 = 0;
scanf("%d", &var1);

完美无缺。

我一直认为存储一个只使用变量名的值...为什么我们指定地址lcoation?

4 个答案:

答案 0 :(得分:3)

scanf函数需要知道var1存储在内存中的哪个位置才能对其进行修改。如果您只将var1传递给scanf,那么只有var1的值会被压入堆栈。您需要传递&var1,以便var1地址被推送到堆栈。完成后,scanf可以取消引用指针以修改调用函数中的变量。

答案 1 :(得分:3)

因为C按值复制参数。考虑这个(无用的)功能:

void set_one(int x)
{
    x = 1;
}

当您将其称为

int i = 2;
set_one(i);

相同
set_one(2);

该函数获取2的副本,将其称为x,然后使用1覆盖它并返回。原始2,即i,不会更改。

要使此功能具有远程用途,您必须告诉 where 将结果放在结果位置

void set_one(int *p)
{
    *p = 1;
}

现在,调用set_one(&i)告诉函数将结果存储在变量名i指定的位置,结果会被覆盖。

答案 2 :(得分:0)

  

为什么我们指定地址lcoation?

因为编译器不知道存储值的位置,这就是为什么它需要一个变量地址来存储值而不是变量。

答案 3 :(得分:0)

因为传入C的默认参数是按值传递参数。指定地址时,地址指向的内容将被函数修改,并且在调用函数中可见。