我正在学习C中的指针,我发现一些话题确实令人困惑。
我搜索谷歌和这个特定的网站,但无法理解它们。
我对表单变量采取了一些问题:
1) a = 2和& a = 2之间有什么区别?
2) 为什么&a
用作l值是非法的?
据我了解,&a=2;
是非法的,而且& a是非法的l值,因为& a包含内存地址而不是内存内容。
因为内存地址是整数形式,所以我们不能将值赋给整数。
3) 然后scanf()
函数会发生什么?
我的意思是如果我们采用像scanf("%d",&a);
这样的例子。为什么&a
在这里使用,为什么不*(&a)
。为什么编译器不显示任何类型的错误?
请帮助解释:)
答案 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,甚至是操作系统本身,因此它可能会导致段错误和崩溃。总是知道你把东西放在哪里。