鱼C论坛

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

关于reinterpret_cast对字串地址输出问题求助

[复制链接]
发表于 2013-3-15 16:03:01 | 显示全部楼层 |阅读模式

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

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

x
#include <iostream>
#include <stdio.h>
int main()
{
const unsigned short ITEMS = 5;

int intArray[ITEMS] = {1, 2, 3, 4, 5};
char charArray[ITEMS] = {'F', 'i', 's', 'h', 'C'};

int *intPtr = intArray;
char *charPtr = charArray;

std::cout << "整型数组输出: " << '\n';
for( int i=0; i < ITEMS; i++ )
{
  std::cout << *intPtr << " at " << reinterpret_cast<unsigned long> (intPtr) << '\n';
  intPtr++;
}

std::cout << "字符型数组输出: " << '\n';
for( int j=0; j < ITEMS; j++ )
{
  std::cout << *charPtr << " at " << reinterpret_cast<unsigned long> (charPtr) << '\n';
  charPtr++;
}

return 0;
}
这个是小甲鱼的源代码,不明白为什么去掉reinterpret_cast<unsigned long>输出的结果是这样的
整型数组输出:
1 at 1245032
2 at 1245036
3 at 1245040
4 at 1245044
5 at 1245048
字符型数组输出:
F at FishC烫
i at ishC烫
s at shC烫
h at hC烫
C at C烫
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-15 20:08:41 | 显示全部楼层
  1. #include<iostream>
  2. int main()
  3. {
  4.         int int_arroy[5]={1,2,3,4,5};
  5.         int *point_int_arroy=int_arroy;
  6.         for (int i=0;i<5;++i)
  7.         {
  8.                 std::cout<<"int_arroy[0]"<<"="<<int_arroy[i]<<"地址为"<<point_int_arroy+i<<'\n';
  9.         }
  10.         for (int i=0;i<5;++i)
  11.         {
  12.                 std::cout<<"int_arroy[0]"<<"="<<int_arroy[i]<<"地址为"<<reinterpret_cast<unsigned long>( point_int_arroy+i)<<'\n';
  13.         }//结论:利用reinterpret_cast<T>(TypePoint)将指针转化成T类型,该例子是将十六进制地址转换成十进制
  14.        
  15.         char char_arroy[5]="LOVE";
  16.         char *point_char_arroy=char_arroy;
  17.         for (int i=0;i<5;++i)
  18.         {
  19.                 std::cout<<"char_arroy[0]"<<"="<<char_arroy[i]<<"地址为"<<reinterpret_cast<unsigned long>( point_char_arroy+i)<<'\n';
  20.         }
  21.         for (int i=0;i<5;++i)
  22.         {
  23.                 std::cout<<"char_arroy[0]"<<"="<<char_arroy[i]<<"地址为"<<point_char_arroy+i<<'\n';
  24.         }
  25.         std::cin.ignore(100,'\n');
  26.         std::cin.get();
  27.         return 0;
  28. }//字符数字的名字就是地址,反过来如果输出一个字符的地址就会当做字符数组输出
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-15 20:09:30 | 显示全部楼层
这个类似  你看看我写的备注
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-15 20:12:47 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-3-16 09:34:36 | 显示全部楼层
看过了,没有看懂
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-8-14 17:48:37 | 显示全部楼层
本帖最后由 南风烟雨五庄观 于 2013-8-14 17:57 编辑

gwcome在2楼用红字高亮 已经注释得很清楚了。谢谢!
我尝试用更通俗的话来复述gwcome的意思:
对于C++编译器而言,数组的名字同时有两层涵义,一是数组在内存的首地址,二就是数组名字。当我们的指令形如:cout<<数组名的时候,编译器就面临一个选择:人类到底是想输出数组内容呢?还是输出元素地址呢?
最后它根据概率统计,会自作聪明地认为我们大部分时候是
(从当前指针位置开始)输出数组的内容,而不是当前元素的地址。所以说,这纯粹是编译器为了秀自己AI而搞出来的小麻烦,是它太想模拟人类的思维习惯了:lol:因此,必须用一个强制转换格式符来明确告诉编译器,我这里需要输出的是当前元素的地址。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-5 15:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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