C++中的reinterpret_cast及取变量的地址

 

在C++中,我们经常有取变量地址的操作,实际上是取变量在内存中的开始处的地址,例如:

 

  1. #include<iostream>   
  2. using namespace std;  
  3. struct T  
  4. {  
  5.    int i;  
  6.    int j;  
  7. }  
  8. int main(void)  
  9. {  
  10.    T t;  
  11.    cout << &t << endl;      //取变量t的地址   
  12.    cout << &t.i << endl;    //取变量t中i处的地址   
  13. }  

#include<iostream>using namespace std;struct T{ int i; int j;}int main(void){ T t; cout << &t << endl; //取变量t的地址 cout << &t.i << endl; //取变量t中i处的地址}

 

打印出的结果是相同的。

 

在C++中reinterpret_cast可以把内存中的字节以另一种方式来解释,相当于同一件事情(等价于内存中的某一区域)不同的人来看待有不同的结果。以下是一段使用reinterpret_cast的代码:

  1. #include <iostream>   
  2. #include <cstring>   
  3. using namespace std;  
  4. struct T  
  5. {  
  6.     long  i;  
  7.     int j;  
  8. };  
  9. int main(void)  
  10. {  
  11.     T t;  
  12.     memset(&t, 0, sizeof(t));  
  13.     t.i = 65;  
  14.     unsigned char *p = reinterpret_cast<unsigned char *>(&t);  
  15.     cout << *p << endl;  
  16.     p++;  
  17.     *p = 1;  
  18.     p++;  
  19.     *p = 1;  
  20.     p++;  
  21.     *p = 1;  
  22.     cout << t.i << endl;      
  23. }  
 

在我的VS2008下编译通过,打印出A和16843073

这是怎么得到的呢?

 

我们把内存想象成一格一格的,在t.i处的地址在我电脑上打印出来是地址0012FF54于是有:

在0012FF54中存放着65,即01000001,

而在0012FF55一直到0012FF57中全部存放的是0(因为之前我用memset将他们都设为0了),

而当我使用reinterpret_cast<unsigner char*>时,相当于说将0012FF54内存中的内容作为一个unsigned char来看待,于是得到了65所对应的ASII值,打印出来为字符A。

之后我使p每次递增一(因为unsigned char 只占一个字节),所以之后将0012FF55到0012FF57的内容都设置为了1,

即在0012FF55中为0000001, 0012FF56中也为00000001,0012FF57中也是00000001,最后我要打印

i的值,现在i是作为long形式来打印的,它占4个字节,所以i的值应该是将0012FF54到0012FF57所有的内容联合起来解译,即为

00000001000000010000000101000001(B)[二进制形式],转换成十进制正好是16843073.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值