Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中扫描输入时,为什么需要(&;)的地址位置_C_Variables_Reference - Fatal编程技术网

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

在C中扫描输入时,为什么需要(&;)的地址位置,c,variables,reference,C,Variables,Reference,我正在看一些C注释,我想知道您是否要这样做: int var1 = 0; scanf("%d", var1); 你会遇到一些问题。其中,就好像您在写操作的地址和位置一样: int var1 = 0; scanf("%d", &var1); 它工作得非常好 我一直认为,要存储一个值,只需使用变量名……为什么要指定地址 为什么我们要指定地址 因为编译器不知道在哪里存储值,这就是为什么它需要一个变量地址来存储值而不是变量。因为在C中传递的默认参数是按值传递参数。指定地址时,该地址指向的内容

我正在看一些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
指定的位置,结果会被覆盖