我想从标准输入中读取一个数字。我不明白为什么在变量名前加上&
是scanf
函数的要求:
int i;
scanf("%d", &i);
< p>为什么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
,那么scanf
只会看到未初始化的值,这既是未定义行为(UB),也不足以让scanf
知道如何修改i
。
不需要这个。
char s[1234];
scanf("%s", s);
即使没有任何一个&
,也可以完美运行。而scanf
及其相关函数所需的是指针。为了让它修改特定的变量,你需要传递该变量的地址。对于一些类型,默认情况下会自动进行处理。而对于其他类型,你需要使用&
来获取该变量的地址(获得指向该变量的指针)。
scanf()
存储数值,因此它需要一个存储位置。
通过使用 addressof
或 &(ampersand) 运算符提供存储值的地址(在指针中)来完成这一点。
scanf需要使用地址运算符(&),因为它需要一个指针作为参数。因此,为了将一个变量传递给scanf并将其设置为传入的值,您必须将该变量转换为指针,以便可以更改它。
之所以必须传递指针给scanf,是因为如果您只传递一个变量,您无法直接在scanf内部修改变量,因此您不能将其设置为scanf读取的值。
希望这能帮到您。
sscanf 不需要 &
int decimal;
int *pointer = &decimal;
scanf("%d", pointer);
上述代码有效