马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 南风烟雨五庄观 于 2013-8-14 18:13 编辑
本课旨在阐述数组和指针的关系。作为练习,小甲鱼提供了一个例子。
-- 分别定义一个整型数组和一个字符型数组,用指针来获取数组的每个元素以及地址,打印出来。代码如下:
注意,对于字符型数组,如果要用指针来表示地址,必须要用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
|