为什么scanf需要&?

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

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

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

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

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

在这种情况下, &i是指向变量i的指针值。 scanf可以用它来修改i 。 如果你通过i ,那么它只会看到一个未初始化的值,(a)是UB,(b)不足以让scanf知道如何修改i

这不是必需的。

 char s[1234]; scanf("%s", s); 

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

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

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

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

希望这可以帮助。

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

sscanf不需要&

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

以上代码有效