我正在阅读一些C笔记,我想知道你是否要这样做:
int var1 = 0;
scanf("%d", var1);
你会遇到某种问题。好像你用操作的地址位置写的那样:
int var1 = 0;
scanf("%d", &var1);
完美无缺。
我一直认为存储一个只使用变量名的值...为什么我们指定地址lcoation?
答案 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的默认参数是按值传递参数。指定地址时,地址指向的内容将被函数修改,并且在调用函数中可见。