22

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

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

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

4

7 回答 7

29

它需要改变变量。由于 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;
}
于 2012-05-15T09:16:17.690 回答
11

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

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

于 2012-05-15T09:18:03.600 回答
6

这不是必需的。

char s[1234];

scanf("%s", s); 

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

于 2012-05-15T13:39:28.110 回答
4

因为否则它只会更改副本而不是原件。

于 2012-05-15T09:16:20.437 回答
2

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

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

希望这可以帮助。

于 2012-05-15T09:17:49.313 回答
2

scanf()存储值,所以它需要一个地方来存储它们。
这是通过使用addressof或 &(&(&) 运算符提供存储值的地址(在指针中)来完成的。

于 2012-05-15T09:19:36.130 回答
0

sscanf 不需要 &

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

以上代码有效

于 2012-05-15T09:22:14.900 回答