南风烟雨五庄观 发表于 2013-8-14 18:09:52

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

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

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

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


注意,对于字符型数组,如果要用指针来表示地址,必须要用reinterpret_cast这个格式强制转换符。否则没法得到10进制形式的元素地址。上述代码中的第一处使用reinterpret_cast<T>(TypePoint)将指针转化成T类型,该例子是将整型数组的十六进制地址转换成十进制;第二处使用reinterpret_cast是针对字符型数组。可以测试,这里如果不用格式转换符,输出结果是F at FishC@i atishC@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




苹果沃珂 发表于 2013-8-15 09:59:40

学习了,谢谢

穆风程小婷 发表于 2015-12-8 10:44:50

{:5_110:}

梦想成大神 发表于 2016-2-17 16:32:00

{:10_281:}

aicanxxx 发表于 2016-6-22 09:54:14

写的很好,学习了

annqlm 发表于 2018-6-20 15:37:27

厉害了{:9_232:}
页: [1]
查看完整版本: 【新手请看】C++快速入门第10课 reinpret_cast的理解