请问一下,这个转换是做什么用的,怎么用?

suqin1024 2009-06-22 06:44:25
reinterpret_cast

最好解释得通俗一点,请不要随便从哪个网站拷贝过来就回复,或者直接就给个看不懂的链接,谢谢各位大哥哥~~~
...全文
63 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kevin_Perkins 2009-06-22
  • 打赏
  • 举报
回复
我的理解是,任何指针在内存中都是4个字节长,因此,不考虑类型,其中存储的数据可以指向任何内存单元,reinterpret_cast正是忽略了类型匹配,强制转换成用户想要的类型。典型的例子就是将用户自定义类的对象存储到磁盘上,对象指针都要转换成char*,用到reinterpret_cast<char*>(&userObject);
但是,出于安全性的考虑,编译器会对不匹配类型的指针类型转换报告警告,我们在编程中也应该避免不匹配类型指针的转换。
大师告诫我们,任何转换都存在危险,任何转换背后都隐藏着不可告人的秘密。
Walf_ghoul 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Demon__Hunter 的回复:]
引用 7 楼 suqin1024 的回复:
引用 6 楼 Demon__Hunter 的回复:
reinterpret_cast <T>(v)的结果就是把表达式v的结果转化成T类型的.


也就是说4楼的代码中把&f的结果转化为int*类型吗?可是&f是个地址呀,怎么会是1085905306呢?地址不是0x....吗?


reinterpret_cast <int*>(&f)返回的结果是一个int*的指针变量的值,*reinterpret_cast <int*>(&f)这样
的话,是从地址值为reinterpret_cast <int*>(&f)内存开始,…
[/Quote]

解释的不错,顶个
机智的呆呆 2009-06-22
  • 打赏
  • 举报
回复
地址值为reinterpret_cast <int*>(&f)内存开始,涵盖4个字节的内存,也就是f变量所对应的那4个字节存储空间。
机智的呆呆 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 suqin1024 的回复:]
引用 6 楼 Demon__Hunter 的回复:
reinterpret_cast <T>(v)的结果就是把表达式v的结果转化成T类型的.


也就是说4楼的代码中把&f的结果转化为int*类型吗?可是&f是个地址呀,怎么会是1085905306呢?地址不是0x....吗?
[/Quote]
reinterpret_cast<int*>(&f)返回的结果是一个int*的指针变量的值,*reinterpret_cast<int*>(&f)这样
的话,是从地址值为reinterpret_cast<int*>(&f)内存开始,涵盖4个字节的内存,把内存里的数据按照int型的数据的组织方式
解析出来后,赋给i,所以i的值为解析后的值1085905306,又由于float的数据存储方式不同于int,以float解析成5.8的四个
字节里内存数据,以int方式解析成1085905306。
suqin1024 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 Demon__Hunter 的回复:]
reinterpret_cast <T>(v)的结果就是把表达式v的结果转化成T类型的.
[/Quote]

也就是说4楼的代码中把&f的结果转化为int*类型吗?可是&f是个地址呀,怎么会是1085905306呢?地址不是0x....吗?
机智的呆呆 2009-06-22
  • 打赏
  • 举报
回复
reinterpret_cast<T>(v)的结果就是把表达式v的结果转化成T类型的.
Walf_ghoul 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hairetz 的回复:]
http://doserver.net/read.php?520

我觉得你看完这个应该能够理解的。
[/Quote]
不错。。。
NirvanaVirus 2009-06-22
  • 打赏
  • 举报
回复
//那么我也只能简单地解释一下喽~

#include <iostream>
using namespace std;

int main(){

float f = 5.8f;

cout << f << endl; //结果:5.8

int i = *reinterpret_cast<int*>(&f); //<------转换的用法

cout << i << endl; //结果:1085905306
}

/*
解释:“reinterpret_cast”的名字这么长,C++的老爹地“Bjarne Stroustrup”之所以把
它设计的这么长(丑陋),其本意就是不想让我们去用它或者尽量不要去用它,因为它比强
制类型转换还要危险。它的作用是可以将任意两种指针之间随意转换,但是这个转换后的结
果就很莫名其妙了。楼主慎用、慎用、再慎用!其实也不用琢磨它,那些搞C++的老泡儿们都
很少用~
*/
  • 打赏
  • 举报
回复
http://doserver.net/read.php?520

我觉得你看完这个应该能够理解的。
tianya0609 2009-06-22
  • 打赏
  • 举报
回复
Walf_ghoul 2009-06-22
  • 打赏
  • 举报
回复
reinterpret_cast 操作能把一种数据类型改变成另一种.它应当被用在两种不可调和的指针类型之间.

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧