C++_转换运算符_reinterpret_cast

reinterpret_cast作用:

对数据类型重新解释,用来处理无关类型的相互转换,属于强制类型转换。

reinterpret_cast语法:

reinterpret_cast <typeid>(expression)

说明:

(1)它返回一个新值,该值的类型与expressoin的类型不同,但两个值的二进制位完全相同

举例一:说明该值的类型与expressoin的类型不同,但两个值的二进制位完全相同

#include <iostream> 
using namespace std;

void main() 
{ 
	int i = 875770417; 
	cout<<i<<" "<<endl;
	char* p = reinterpret_cast<char*>(&i);
	for(int j=0; j<4; j++)
		cout<<p[j]<<" ";
	cout<<endl;
}
输出


说明:875770417当做整形数据存储在内存中时,在内存中的数据表示从低位到高位依次是0x31 0x32 0x33 0x34。当其当做整形一起输出时,就是875770417。当把该值直接强制转换为char*时,只是将i的首地址(原来为int*类型)强制变成了char*类型,它们所指向的地址还是一样的,此时输出四个字节的值时,是按照字符识别输出的,既输出 1 2 3 4。

(2) reinterpret_cast使用时有很大的风险,慎用之。

举例二:

int *ip;
char *pc = reinterpret_cast<char*>(ip);

说明:程序员必须永远记得 pc 所指向的真实对象其实是 int 型,而并非字符数组。任何假设 pc 是普通字符指针的应用,都有可能带来有趣的运行时错误。问题源于类型已经改变时编译器没有提供任何警告或错误提示。当我们用int 型地址初始化pc 时,由于显式地声明了这样的转换是正确的,因此编译器不提供任何错误或警告信息。后面对 pc 的使用都假设它存放的是char* 型对象的地址,编译器确实无法知道pc 实际上是指向 int 型对象的指针。因此用 pc 初始化str 是完全正确的——虽然实际上是无意义的或是错误的。查找这类问题的原因相当困难,特别是如果ip 到 pc 的强制转换和使用pc 初始化 string 对象这两个应用发生在不同文件中的时候。

注意:

(1)  reinterpret _cast不能转换掉expression的const、volitale或者_unaligned属性

(2) reinterpret_cast是为了映射到一个完全不同类型的意思,这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的,这是所有映射中最危险的,即不建议使用。

参考:

http://blog.csdn.net/coding_hello/article/details/2211466

http://www.cnblogs.com/ider/archive/2011/07/30/cpp_cast_operator_part3.html

http://baike.baidu.com/view/1263731.htm


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值