为什么scanf需要&?

时间:2012-05-15 09:14:49

标签: c scanf

我想从stdin读取一个数字。我不明白为什么scanf要求在我的变量名称之前使用&

int i;
scanf("%d", &i);

为什么scanf需要变量的地址?

7 个答案:

答案 0 :(得分:18)

需要更改变量。由于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;
}

答案 1 :(得分:7)

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

在这种情况下,&i是一个引用变量i的指针值。 scanf可以使用此修改i。如果您通过i,那么它只会看到未初始化的值,(a)是UB,(b)不足以让scanf了解如何修改i。< / p>

答案 2 :(得分:5)

不需要。

char s[1234];

scanf("%s", s); 

在任何地方都没有单&的情况下工作正常。 scanf和公司需要的是指针。要让它修改特定变量,请传递该变量的地址。对于默认情况下发生的几种类型。对于其他人,您使用&获取地址(获取指向该变量的指针)。

答案 3 :(得分:3)

因为否则它只会改变副本而不是原始副本。

答案 4 :(得分:2)

scanf需要addressOf运算符(&amp;),因为它将指针作为参数。因此,为了传入要设置为传入值的变量,您必须从变量中指出一个指针,以便可以更改它。

必须将指针传递给scanf的原因是,如果您刚刚传递了一个变量,则无法直接更改scanf中的变量,因此您无法将其设置为scanf读入的值。

希望这有帮助。

答案 5 :(得分:2)

scanf()存储值,因此需要存储它们的位置 这是通过提供地址(指针)来完成的 使用addressof或&amp;(&符号)运算符存储值的位置。

答案 6 :(得分:0)

sscanf不需要&amp;

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

以上代码有效