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.youkuaiyun.com/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