变量寻址

时间:2012-08-18 07:29:37

标签: c++ pointers memory-address

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中的值应该相同吗?

4 个答案:

答案 0 :(得分:2)

从字面上解释的

int *p = a获取存储在a中的并尝试将其解释为内存地址以存储在{{ 1}}。虽然在计算上是合法的,但如果没有明确的类型转换,C ++将不允许这样做,因为这通常是而不是你想要做的事情。

语句pint *p = a不同的原因很简单:第一个语句,以下是

的简写
*p = a

初始化指针,因此它需要RHS上的内存地址,而第二个语句是为int *p; p = a; 指向的位置赋值,所以期望(在此case)RHS上的整数。

如果您要初始化p以指向p,则可以改为使用aint * p = &a,其中p = &a是运营商的地址。 从不尝试取消引用未初始化的指针!您最终会在一个基本上任意的位置触摸内存,这可能会导致分段错误(导致崩溃)或开始覆盖程序中的其他数据(导致模糊和不可重现的错误)。

运行示例代码时,&p具有不同的值,因为&a从未被指定为指向p的地址。关于为什么你可能在a中获得任何非零值的一些简短背景:局部变量是从一个特殊的内存区域分配的,称为 stack ,它还存储有关函数调用和返回地址。每个进程都有自己的堆栈。但至关重要的是,堆栈中未使用的区域在使用之前并未真正归零或以其他方式清除(除非在调试版本中,这些版本往往会为未初始化的指针分配非常明显的值,如p0xCCCCCCCC )。如果您的编译器没有为您自动设置默认值(并且发布版本通常不会有这样的自动初始化,为了提高效率),您在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会出错,因为pint*,而aint。可以将其视为int* p = a

答案 3 :(得分:0)

int *p = a; - 这意味着您要声明一个变量并为其赋值。变量名称为p,其类型为int *的值为a(10),将分配给pint *p = a;相当于

int *p; 
p = a;

我们无法将int值赋予int *

*p = a; - 您正在向int而不是*pp。所以这很好。在这样做之前不要忘记为p分配内存,否则可能导致崩溃(未定义的行为),因为p可能有一些垃圾值。

我希望您尝试将a的地址与p联系起来。在你的情况下,你可以这样做。

int a;
int *p = &a;