内存中实际发生的事情,
int a;
a=5;
int a;
scanf("%d",&a);
或为什么scanf使用&接受价值观? 谁能请...解释?
答案 0 :(得分:1)
如果scanf
正确填写,则没有区别,以确保始终检查结果:
if (scanf("%d", &a) == 1) {
...
}
如果用户输入是有效数字,它将填充第一个参数指向的变量的内容。
任何人都可以......解释一下吗? (如果可能的话,图示)
答案 1 :(得分:0)
要了解发生了什么事情需要告诉一些什么意味着变量,而不是说指针及其类型,最后解释scanf
如何工作以及为什么检查其返回值的好习惯。
让我们问什么是变量a
?
a
只是命名的内存地址。当您输入代码a
时,它基本上会告诉编译器获取存储在该内存地址上的值,在您的情况下值为5
。
因此,当您将a
传递给函数时,您只需传递您的情况下的值5。
如果希望函数将值写入变量,则必须将指针传递给变量a
。
什么是指针?
指针只是内存地址,包含有关此内存地址的数据类型的信息。
为什么你需要有关类型的信息编译器?
因为不同的类型在memmory中占据不同的大小(1B,2B无论如何)。
基本上,您可以在函数参数中指定指针的类型。例如,让我们定义函数f
void f(int* b){
b = 42;
}
你可以像这样调用函数f
:
F(&安培;一个);
在调用之后,变量a
的值为42
。
但是函数scanf
不是这种情况继续阅读...
如何运作scanf?
函数scanf
声明为:
int scanf ( const char * format, ... );
这些...
表示该函数接受可变数量的参数。所以在开始时没有参数类型及其数量的信息。因此,您必须在字符串format
中指定每个参数的每种类型。
所以当你写:
scanf("%d", &a);
你说的是:"嘿功能scanf
我给你的变量地址,请把我写给scanf
从标准输入中读取的数字的地址值。并且函数知道变量a
的指针是格式字符串int
的{{1}}类型。
不要忘记检查功能scanf的返回值
此外还有检查函数scanf的返回值的好习惯,它告诉您方法是成功还是失败。 (用户可以提供文字"你好"而不是数字。)
有关函数scanf及其返回值的更多信息,您可以找到in documentation。