为什么& a是非法的l值以及为什么在scanf()函数中使用它

时间:2014-10-17 15:33:00

标签: c

我正在学习C中的指针,我发现一些话题确实令人困惑。
我搜索谷歌和这个特定的网站,但无法理解它们。

我对表单变量采取了一些问题:

1) a = 2和& a = 2之间有什么区别?
2) 为什么&a用作l值是非法的?

据我了解,&a=2;是非法的,而且& a是非法的l值,因为& a包含内存地址而不是内存内容。 因为内存地址是整数形式,所以我们不能将值赋给整数。

3) 然后scanf()函数会发生什么?

我的意思是如果我们采用像scanf("%d",&a);这样的例子。为什么&a在这里使用,为什么不*(&a)。为什么编译器不显示任何类型的错误?

请帮助解释:)

3 个答案:

答案 0 :(得分:0)

您无法为&a分配值,因为&a表示存储变量a地址,并且该地址是一次确定的所有在程序启动时都无法更改。

使用scanf时,您希望scanf函数修改一个或多个变量。因此,您必须将要修改的变量的地址传递给scanf

答案 1 :(得分:0)

正如人们所评论的那样,理解 scanf() 会让您受益。此链接包含一些示例代码和良好的使用说明。

This may help understand what L-value and R-value 是。

您的问题:
在运行时创建a时分配&a的地址,即a

通过尝试声明&a = 2;,您尝试重新分配a所在的地方或地址。例如:
假设a的地址是0x0000ABCD
然后你的陈述将试图断言

0x0000ABCD. = 2;// an illegal assignment

这不可能是真的,在编译时,编译器警告只是告诉你那个错误。不允许以这种方式重新分配地址

注意 ,您可以使用变量的地址来设置指向特定位置的指针:

int a, *pB;

pB = &a;//now pB points to the location of a  

对于运行时引擎,它看起来像:

pB = 0x0000ABCD; //a legal assignment

答案 2 :(得分:0)

你认为& a = 2是非法的是正确的,因为它试图将整数值存储到整数中。例如,它可能等于0x0fb8b815 = 2或4 = 7,编译器不会喜欢它。毕竟,这甚至意味着什么?

对于scanf(),它需要两个参数。第一个描述了您正在寻找的数据类型; “%d”正在寻找一个整数。第二个参数是您希望存储数据的位置。

所以:

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

你给了scan的内存地址,并说你想要一个整数。这样做,因为我们已将a声明为int类型。 & a是解除引用,并转换为表示内存中所在位置的数字.Scanf接受用户输入,并尝试将该输入放入作为第二个参数给出的内存位置。你可以这样调用scanf:scanf("%s", 0x8484af00);。您将为它提供一个特定的内存位置,作为整数文字,以便存储数据。这是一个非常糟糕的主意,除非你以某种方式确切知道该内存位置的用途! '%s'选项表示你想要一个字符串,所以它可能会非常冗长,而像这样的任意内存位置很可能会破坏操作系统。像这样的技巧可能会尝试覆盖另一个程序使用的ram,甚至是操作系统本身,因此它可能会导致段错误和崩溃。总是知道你把东西放在哪里。