为什么scanf需要&?

Nic*_*ick 10 c scanf

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

int i;
scanf("%d", &i);
Run Code Online (Sandbox Code Playgroud)

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

Thi*_*ter 18

它需要改变变量.由于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;
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*sop 7

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

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


Cor*_*bin 5

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


Jer*_*fin 5

这不是必需的.

char s[1234];

scanf("%s", s); 
Run Code Online (Sandbox Code Playgroud)

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