我有一段代码,我在某个地方看到它,我试图弄清楚它是如何工作的,但我不能。
就是这样:
#include <iostream>
using namespace std;
int main() {
int a = 2;
char * p = (char *) &a;
*(p + 1) = 1;
cout << (int *) p << endl;
return 0;
}
我认为在p中它存储变量a的二进制文件,如00000010
。
它比下一个直接地址存储00000001
。
当我尝试打印(int *)
p时,它从该地址获取4个字节并将其转换为int。
当我运行该程序时,结果不是预期的。它仅显示变量a
的地址。没有观察到变化。
请您解释一下这是如何运作的?为什么?
PS:如果我想显示p的值,它只显示2而不是我预期的那样。
答案 0 :(得分:3)
cout << (int *) p << endl;
与cout << &a << endl;
相同(只是a
的地址。)
int a = 2;
cout << sizeof(a) << endl; // 4 (int is 4 bytes)
cout << sizeof(&a) << endl; // 8 (64b machine, so pointer is 8 bytes)
char *p = (char *) &a; // p points to first byte of a (normally 4 bytes)
cout << (int) *p << endl; // 2 // Little Endian, the first byte is actually the last
cout << (int) *(p + 1) << endl; // 0
*(p + 1) = 1; // second byte of a is now set to 1
cout << a << endl; // a now changes to 258 (0000 0001 0000 0010)
答案 1 :(得分:2)
PS:如果我想显示p的值,它只显示2而不是258我的方式 预期
p
的值是它指向的对象的地址。看来你的困惑就在这里。如果你取消引用p
,你将获得它所指向的对象的价值,这是不同的。
因此,在您的情况下,p
被初始化为a
的地址。之后,没有任何内容(例如,你没有p=&SomeOtherObject
)。
cout << (int *) p << endl; // Print value of pointer -which is address
因此,您打印的p
值为a
的地址。
如上所述,请记住
*(p+1) = 1
如果sizeof (int)
与sizeof (char)
相同,可能是未定义的行为