我想从标准输入读取一个数字。我不明白为什么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);
以上代码有效