C++小问题!!!!!!

aaaa3105563 2009-03-25 07:08:26
char **p;
char *s[]={"zhong","guo","ren","min"};
p=s+2;
cout<<*p+4<<endl;


为什么输出的结果为 guo
...全文
106 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Seanxiaoxiao 2009-03-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zqz981 的回复:]
引用 3 楼 Seanxiaoxiao 的回复:
贴个性感的内存布局你就知道了
6d 69 6e 00 72 65 6e 00 67 75 6f 00 7a 68 6f 6e 67 00 00 00 00 00 00 00 66 00 3a 00 5c 00 64 00 64 00 5c 00 76 00 63 00 74
m  i  n  .  r  e  n  .  g  u  o  .  z  h  o  n  g

s + 2会将指针指向ren的第一个
然后p+4嘛,就指向guo了,
数组指针和字符串指针的增加解析是不同的


问 seanxiaoxiao 如何查看内存分布?
[/Quote]
VS2008,调试,然后查看内存,输入表达式~~~~~
我觉得这个指针解析应该是标准规定的,应该是编译器无关的,晚上回去试验一下
passionboy03 2009-03-25
  • 打赏
  • 举报
回复
我用的vc6,就像你说的编译器的问题吧,所以把存储情况也贴出来了,呵呵
[Quote=引用 8 楼 zqz981 的回复:]
引用 5 楼 passionboy03 的回复:
看下存储结构
s[0] = 0x0042f028 zhong
s[1] = 0x0042f024 guo
s[2] = 0x0042f020 ren
s[3] = 0x0042f01c min
s+2存储的是0x0042f020 ,*p存储的也是0x0042f020 ,也就是字符串“ren”的地址,
再加上一个地址的偏移量4(记住指针是4个单位存储的)
所以*p+4 存储的是"guo"的地址

引用楼主 aaaa3105563 的帖子:
char **p;
char *s[]={"zhong","guo","ren","min"};
p=s+…
[/Quote]
zqz981 2009-03-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 passionboy03 的回复:]
看下存储结构
s[0] = 0x0042f028 zhong
s[1] = 0x0042f024 guo
s[2] = 0x0042f020 ren
s[3] = 0x0042f01c min
s+2存储的是0x0042f020 ,*p存储的也是0x0042f020 ,也就是字符串“ren”的地址,
再加上一个地址的偏移量4(记住指针是4个单位存储的)
所以*p+4 存储的是"guo"的地址

引用楼主 aaaa3105563 的帖子:
char **p;
char *s[]={"zhong","guo","ren","min"};
p=s+2;
cout < <*p+4 < <endl;


为什么输…
[/Quote]

我用g++ 编译, 结果为min, 我想这与编译器 有关吧!
同时 我问, 加偏移量4后 应该是到min 不是guo吧
zqz981 2009-03-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Seanxiaoxiao 的回复:]
贴个性感的内存布局你就知道了
6d 69 6e 00 72 65 6e 00 67 75 6f 00 7a 68 6f 6e 67 00 00 00 00 00 00 00 66 00 3a 00 5c 00 64 00 64 00 5c 00 76 00 63 00 74
m  i  n  .  r  e  n  .  g  u  o  .  z  h  o  n  g

s + 2会将指针指向ren的第一个
然后p+4嘛,就指向guo了,
数组指针和字符串指针的增加解析是不同的

[/Quote]
问 seanxiaoxiao 如何查看内存分布?
passionboy03 2009-03-25
  • 打赏
  • 举报
回复
看下存储结构
s[0] = 0x0042f028 zhong
s[1] = 0x0042f024 guo
s[2] = 0x0042f020 ren
s[3] = 0x0042f01c min
s+2存储的是0x0042f020 ,*p存储的也是0x0042f020 ,也就是字符串“ren”的地址,
再加上一个地址的偏移量4(记住指针是4个单位存储的)
所以*p+4 存储的是"guo"的地址

[Quote=引用楼主 aaaa3105563 的帖子:]
char **p;
char *s[]={"zhong","guo","ren","min"};
p=s+2;
cout < <*p+4 < <endl;


为什么输出的结果为 guo
[/Quote]
zqz981 2009-03-25
  • 打赏
  • 举报
回复
g++ linux 下编译 结果为 min
Seanxiaoxiao 2009-03-25
  • 打赏
  • 举报
回复
贴个性感的内存布局你就知道了
6d 69 6e 00 72 65 6e 00 67 75 6f 00 7a 68 6f 6e 67 00 00 00 00 00 00 00 66 00 3a 00 5c 00 64 00 64 00 5c 00 76 00 63 00 74
m i n . r e n . g u o . z h o n g

s + 2会将指针指向ren的第一个
然后p+4嘛,就指向guo了,
数组指针和字符串指针的增加解析是不同的
lpf000 2009-03-25
  • 打赏
  • 举报
回复
p=&s[2];//"guo"
cout<<*p+4;//p解引用就是"guo" , +4未定义不是变量
downmooner 2009-03-25
  • 打赏
  • 举报
回复
我VS05 显示异常的。编译器问题吧

65,211

社区成员

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

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