为什么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);
以上代码有效