我想从stdin读取一个数字。我不明白为什么scanf
要求在我的变量名称之前使用&
:
int i;
scanf("%d", &i);
为什么scanf
需要变量的地址?
答案 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);
以上代码有效