gpt4 book ai didi

c++ - 变量寻址

转载 作者:太空宇宙 更新时间:2023-11-04 16:26:02 24 4
gpt4 key购买 nike

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 = &a或者p = &a 而不是,其中 & 是地址运算符。 永远不要尝试解引用未初始化的指针!您最终会触及基本上任意位置的内存,这可能会导致段错误(导致崩溃)或开始覆盖程序中的其他数据(导致模糊且不可重现的错误)。

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

关于c++ - 变量寻址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12016783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com