变量寻址

Variable addressing

本文关键字:寻址 变量      更新时间:2023-10-16
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中的值应该相同吗?

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

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

int *p;
p = a;

正在初始化指针,因此它期望 RHS 上的内存地址,而第二个语句为 p 指向的位置赋值,因此(在本例中(期望 RHS 上的整数。

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

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

>int *p = a;初始化指针pa不是指针(因此错误(,而*p=a; a分配给p指向的内存,语法上讲。此外,前者是初始化,而后者是赋值

请注意,在您的情况下,*p=a调用未定义的行为,因为p不指向程序的合法内存,即您没有为p分配内存。

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

p = &a;

使用 int *p = a 给出错误,因为pint*,而aint。把它想象成int* p = a.

int *p = a; - 这意味着您正在声明一个变量并为其断言值。变量名称为 p,其类型为 int *您正在协助的值是 a (10(,该值将分配给pint *p = a;相当于

int *p; 
p = a;

我们不能断言int值到int *.

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

我希望您正在尝试将a地址断言到p.在这种情况下,您可以执行以下操作。

int a;
int *p = &a;