将char *转换为int * C ++

时间:2015-11-13 10:34:01

标签: c++ pointers

我有一段代码,我在某个地方看到它,我试图弄清楚它是如何工作的,但我不能。

就是这样:

#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而不是我预期的那样。

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)

相同,

可能是未定义的行为