为什么scanf需要使用&符号?

24

我想从标准输入中读取一个数字。我不明白为什么在变量名前加上&scanf函数的要求:

int i;
scanf("%d", &i);
< p>为什么scanf需要变量的地址?

7个回答

31

需要改变变量的值。由于C中所有参数都是按值传递的,如果你想让一个函数能够更改参数的值,你需要传递一个指针。

下面是一个超级简单的示例:

void nochange(int var) {
    // Here, var is a copy of the original number. &var != &value
    var = 1337;
}
void change(int *var) {
    // Here, var is a pointer to the original number. var == &value
    // Writing to `*var` modifies the variable the pointer points to
    *var = 1337;
}
int main() {
    int value = 42;
    nochange(value);
    change(&value);
    return 0;
}

刚刚发现这个并且自己在学习。如果有人看到的话,我有一个后续问题...&符号是否允许你访问存储位置以便更改值?那是我理解的方式... - Dan
@Dan 是的,你说得对。虽然你完全正确,但如果你还有点害怕,我建议你在YouTube上观看"Ashley Mills"的C语言指针教程视频。 - aderchox

12

C语言函数参数始终为“传值”,这意味着函数scanf只看到您指定为参数表达式的当前值的副本。

在这种情况下,&i是一个指向变量i的指针值。 scanf 可以使用它来修改i。如果您传递i,那么scanf只会看到未初始化的值,这既是未定义行为(UB),也不足以让scanf知道如何修改i


7

不需要这个。

char s[1234];

scanf("%s", s); 

即使没有任何一个&,也可以完美运行。而scanf及其相关函数所需的是指针。为了让它修改特定的变量,你需要传递该变量的地址。对于一些类型,默认情况下会自动进行处理。而对于其他类型,你需要使用&来获取该变量的地址(获得指向该变量的指针)。


5
否则的话,它只会修改一份副本而不是原始文件。

3

scanf() 存储数值,因此它需要一个存储位置。
通过使用 addressof 或 &(ampersand) 运算符提供存储值的地址(在指针中)来完成这一点。


2

scanf需要使用地址运算符(&),因为它需要一个指针作为参数。因此,为了将一个变量传递给scanf并将其设置为传入的值,您必须将该变量转换为指针,以便可以更改它。

之所以必须传递指针给scanf,是因为如果您只传递一个变量,您无法直接在scanf内部修改变量,因此您不能将其设置为scanf读取的值。

希望这能帮到您。


0

sscanf 不需要 &

int decimal;
int *pointer = &decimal;
scanf("%d", pointer);

上述代码有效


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接