变量寻址
Variable addressing
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
分配给指向 a
的地址。关于为什么你可能会在p
中获得任何非零值的一些简短背景:局部变量是从称为堆栈的特殊内存区域分配的,该区域还存储有关函数调用和返回地址的信息。每个进程都有自己的堆栈。然而,至关重要的是,堆栈中未使用的区域在使用前并没有真正清零或以其他方式清理(也许在调试版本中除外,它倾向于将非常明显的值(如0xCCCCCCCC
或0xBAADF00D
(分配给未初始化的指针(。如果您的编译器没有自动为您设置默认值(并且为了提高效率,发布版本通常不会有这种自动初始化(,那么您在p
中看到的是程序设置其堆栈帧之前恰好位于分配给p
的内存中的内容。
>int *p = a;
初始化指针p
,a
不是指针(因此错误(,而*p=a;
a
分配给p
指向的内存,语法上讲。此外,前者是初始化,而后者是赋值。
请注意,在您的情况下,*p=a
调用未定义的行为,因为p
不指向程序的合法内存,即您没有为p
分配内存。
将a
存储在p
指向的地址(*p
(。如果要将a
(&a
(的地址存储在p
中,则必须使用
p = &a;
使用 int *p = a
给出错误,因为p
是int*
,而a
是int
。把它想象成int* p = a
.
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;
- 从结构寻址时,MMAP变量的行为很奇怪
- 字节真的是最小可寻址单元吗
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- imread() 仍然返回空垫子,尽管在 openCV 4.0.0 中寻址正确
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 如何像在 C++ 中处理数组一样对 .txt 文件中的字符进行寻址?
- C++11右值引用寻址
- 对堆栈增长和寻址的困惑
- C++ std::find() 寻址返回向量的类函数时的意外行为
- 间接寻址运算符如何返回带有运算符重载的指针地址
- Adafruit NeoPixel库在寻址超过7个LED灯条时不起作用
- 在模板 SFINAE 约束中使用间接寻址级别会导致硬错误
- 错误:使用索引寻址和 Clang 的指令的操作数无效
- 是否可以寻址另一个网络中的服务器/客户端套接字?(C++)
- C++中的字节寻址算法
- 指针声明和间接寻址之间的区别
- 仅在使用间接寻址时调用虚函数 — 经典的早期绑定问题?
- c++检查变量以寻址越界
- 变量寻址
- 何时是"replaced"不再可寻址的变量