鱼C论坛

 找回密码
 立即注册
查看: 4677|回复: 5

【新手请看】C++快速入门第10课 reinpret_cast的理解

[复制链接]
发表于 2013-8-14 18:09:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 南风烟雨五庄观 于 2013-8-14 18:13 编辑

本课旨在阐述数组和指针的关系。作为练习,小甲鱼提供了一个例子。

-- 分别定义一个整型数组和一个字符型数组,用指针来获取数组的每个元素以及地址,打印出来。代码如下:

QQ截图20130814180827.jpg

注意,对于字符型数组,如果要用指针来表示地址,必须要用reinterpret_cast这个格式强制转换符。否则没法得到10进制形式的元素地址。
上述代码中的第一处使用reinterpret_cast<T>(TypePoint)将指针转化成T类型,该例子是将整型数组的十六进制地址转换成十进制;
第二处使用reinterpret_cast是针对字符型数组。可以测试,这里如果不用格式转换符,输出结果是
F at FishC@
i at  ishC@
s at shC@
h at hC@
C at C@
根据平台和机子的不同,@可以是其他字符
为什么cout<<charPtr 不是输出元素地址而是上面奇怪的样子呢?

我看了小甲鱼写的一篇专门介绍reinpret_cast的日志,很遗憾,看不懂!但后来看了鱼油gwcome在另一篇帖子的回答,豁然开朗。因此我的答案是:
对于C++编译器而言,数组的名字同时有两层涵义,一是数组在内存的首地址,二就是数组名字。当我们的指令形如
cout<<数组名
的时候,编译器就面临一个选择:人类到底是想输出数组内容呢?还是输出元素地址呢?最后它会自作聪明地认为我们大部分时候是想(从当前指针位置开始)输出数组的内容,而不是当前元素的地址。所以说,这纯粹是编译器为了秀自己AI而搞出来的小麻烦,是它太想模拟人类的思维习惯了。因此,必须用一个强制转换格式符来明确告诉编译器,我这里需要输出的是当前元素的地址。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image001.gif





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-15 09:59:40 | 显示全部楼层
学习了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-8 10:44:50 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-17 16:32:00 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-22 09:54:14 | 显示全部楼层
写的很好,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-20 15:37:27 | 显示全部楼层
厉害了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 15:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表