当分配变量的值以及从stdin扫描它时,内部会发生什么?

时间:2016-09-17 10:26:15

标签: c memory scanf

内存中实际发生的事情,

  1. int a; a=5;

  2. int a; scanf("%d",&a);

  3. 或为什么scanf使用&接受价值观? 谁能请...解释?

2 个答案:

答案 0 :(得分:1)

如果scanf正确填写,则没有区别,以确保始终检查结果:

if (scanf("%d", &a) == 1) {
    ...
}

如果用户输入是有效数字,它将填充第一个参数指向的变量的内容。

  

任何人都可以......解释一下吗? (如果可能的话,图示)

看看Understanding the Stack

答案 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