int main()
{
int a = 10;
int *p; // int *p = a; gives me an error: invalid conversion from int to int *.
// Tell me why?
*p = a; // while this runs
cout << &a <<" "<<p;
}
其次&amp; a和p给出2个不同的值。根据我的地址a和存储在指针p中的值应该相同吗?
答案 0 :(得分:2)
int *p = a
获取存储在a
中的值并尝试将其解释为内存地址以存储在{{ 1}}。虽然在计算上是合法的,但如果没有明确的类型转换,C ++将不允许这样做,因为这通常是而不是你想要做的事情。
语句p
与int *p = a
不同的原因很简单:第一个语句,以下是
*p = a
是初始化指针,因此它需要RHS上的内存地址,而第二个语句是为int *p;
p = a;
指向的位置赋值,所以期望(在此case)RHS上的整数。
如果您要初始化p
以指向p
,则可以改为使用a
或int * p = &a
,其中p = &a
是运营商的地址。 从不尝试取消引用未初始化的指针!您最终会在一个基本上任意的位置触摸内存,这可能会导致分段错误(导致崩溃)或开始覆盖程序中的其他数据(导致模糊和不可重现的错误)。
运行示例代码时,&
和p
具有不同的值,因为&a
从未被指定为指向p
的地址。关于为什么你可能在a
中获得任何非零值的一些简短背景:局部变量是从一个特殊的内存区域分配的,称为 stack ,它还存储有关函数调用和返回地址。每个进程都有自己的堆栈。但至关重要的是,堆栈中未使用的区域在使用之前并未真正归零或以其他方式清除(除非在调试版本中,这些版本往往会为未初始化的指针分配非常明显的值,如p
或0xCCCCCCCC
)。如果您的编译器没有为您自动设置默认值(并且发布版本通常不会有这样的自动初始化,为了提高效率),您在0xBAADF00D
中看到的是发生的事情在程序设置堆栈帧之前,将其分配给分配给p
的内存。
答案 1 :(得分:2)
int *p = a;
使用p
初始化指针a
,这不是指针(因此错误),而*p=a;
将a
指定给指向的内存从语法上来说,p
。此外,前者是初始化,而后者是赋值。
请注意,在您的情况下,*p=a
会调用未定义的行为,因为p
没有指向程序的合法内存,即您没有为{{1}分配内存}}
答案 2 :(得分:1)
您将a
存储在p
指向的地址(*p
)。如果您要将a
(&a
)的地址存储在p
中,则必须使用
p = &a;
使用int *p = a
会出错,因为p
是int*
,而a
是int
。可以将其视为int* p = a
。
答案 3 :(得分:0)
int *p = a;
- 这意味着您要声明一个变量并为其赋值。变量名称为p
,其类型为int *
的值为a
(10),将分配给p
。 int *p = a;
相当于
int *p;
p = a;
我们无法将int
值赋予int *
。
*p = a;
- 您正在向int
而不是*p
致p
。所以这很好。在这样做之前不要忘记为p
分配内存,否则可能导致崩溃(未定义的行为),因为p
可能有一些垃圾值。
我希望您尝试将a
的地址与p
联系起来。在你的情况下,你可以这样做。
int a;
int *p = &a;