在C中扫描输入时,为什么需要(&;)的地址位置
我正在看一些C注释,我想知道您是否要这样做:在C中扫描输入时,为什么需要(&;)的地址位置,c,variables,reference,C,Variables,Reference,我正在看一些C注释,我想知道您是否要这样做: int var1 = 0; scanf("%d", var1); 你会遇到一些问题。其中,就好像您在写操作的地址和位置一样: int var1 = 0; scanf("%d", &var1); 它工作得非常好 我一直认为,要存储一个值,只需使用变量名……为什么要指定地址 为什么我们要指定地址 因为编译器不知道在哪里存储值,这就是为什么它需要一个变量地址来存储值而不是变量。因为在C中传递的默认参数是按值传递参数。指定地址时,该地址指向的内容
int var1 = 0;
scanf("%d", var1);
你会遇到一些问题。其中,就好像您在写操作的地址和位置一样:
int var1 = 0;
scanf("%d", &var1);
它工作得非常好
我一直认为,要存储一个值,只需使用变量名……为什么要指定地址
为什么我们要指定地址
因为编译器不知道在哪里存储值,这就是为什么它需要一个变量地址来存储值而不是变量。因为在C中传递的默认参数是按值传递参数。指定地址时,该地址指向的内容将被函数修改,并且在调用函数中可见 要修改
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\u one(&i)
告诉函数将其结果存储在变量名i
指定的位置,结果会被覆盖