0
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;
}

其次 &a 和 p 给出了 2 个不同的值。根据我a的地址和指针p中存储的值应该相同吗?

4

4 回答 4

2

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

int *p = a语句不同的原因*p = a很简单:第一个语句,下面的简写

int *p;
p = a;

正在初始化指针,因此它期望 RHS 上的内存地址,而第二条语句正在为 指向的位置分配一个值p,因此期望(在这种情况下)RHS 上的整数。

如果你想初始化p指向a,你可以使用int * p = &aorp = &a代替,where &is the address-of 操作符。永远不要尝试取消引用未初始化的指针!您最终会在一个基本上任意的位置接触内存,这可能会导致分段错误(导致崩溃)或开始覆盖程序中的其他数据(导致模糊和不可重现的错误)。

当您运行示例代码时,p并且&a具有不同的值正是因为p从未分配到指向a. 关于为什么你可能会得到任何非零值的一些简短背景p:局部变量是从称为堆栈的特殊内存区域分配的,它还存储有关函数调用和返回地址的信息。每个进程都有自己的堆栈。然而,至关重要的是,堆栈中未使用的区域在使用之前并没有真正清零或以其他方式清理(可能在调试版本中除外,它往往会分配非常明显的值,例如0xCCCCCCCC0xBAADF00D到未初始化的指针)。如果您的编译器没有自动为您设置默认值(并且发布版本通常不会有这样的自动初始化,为了提高效率),那么您所看到的p发生p在您的程序设置之前分配给的内存中的内容向上它的堆栈帧。

于 2012-08-18T07:35:50.560 回答
2

int *p = a;初始化一个不是指针的指针(因此出现错误),同时p从语法上讲,分配给指向的内存。另外,前者是初始化,而后者是赋值a*p=a;ap

请注意,在您的情况下,*p=a调用undefined behavior,因为p不指向程序的合法内存,即您没有为p.

于 2012-08-18T07:36:10.213 回答
1

您存储ap指向 ( *p) 的地址。如果要将a( &a) 的地址存储在 中p,则必须使用

p = &a;

使用int *p = a, 会出错,因为pis a int*, whilea是 a int。将其视为int* p = a.

于 2012-08-18T07:33:57.603 回答
0

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

int *p; 
p = a;

我们无法intint *.

*p = a;- 这就是你不同意int的。所以这很好。在执行此操作之前,不要忘记为其他内存分配内存,这可能会导致崩溃(未定义的行为),因为可能有一些垃圾值。*pppp

我希望您正在尝试分配 to 的a地址p。在这种情况下,您可以执行以下操作。

int a;
int *p = &a;
于 2012-08-18T07:49:44.147 回答