+ -
当前位置:首页 → 问答吧 → C求解

C求解

时间:2010-07-29

来源:互联网

本帖最后由 kitifaye 于 2010-07-29 09:52 编辑

各位大牛,小弟学习C语言深度剖析时,有一段
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int a[5]={1,2,3,4,5};
  5.         int *ptr1=(int*)(&a+1);
  6.         int *ptr2=(int*)((int)a+1);

  7.         printf("%x\n%x\n",ptr1[-1],*ptr2);

  8.         return 0;
  9. }
复制代码
对于ptr2的值在我的机器上输出为 2000000
一直未能想明白
小弟菜鸟,求指点
谢谢

作者: kitifaye   发布时间: 2010-07-29

也太基础了, 你干嘛不把 ptr1, ptr2 两个的地址打印出来看看呢

作者: zylthinking   发布时间: 2010-07-29

本帖最后由 liwangli1983 于 2010-07-29 10:03 编辑

这题涉及到了对指针和大小端的理解.如果上面两个都明白的话,画个图算一下就明白了

数组a在内存中的序列是样的: 10002000300040005000

a实际指向序列最前面的1,(int)a后把指针a强制转化成了整数a,所以此时对a加1是给整数加1.再强制转化回来成为int型指针,因为刚才给地址值加1了,所以现在a指向1后面的那个0.因为a是int型指针,那个解引用a的时候把a指向的内存单元及其之后的3个共计四个内存单元的二进制序列解释为整数,此处这个序列是0002.

因为X86是小端法,低地址存低位,显然这里2存在了高地址,最后出来的自然就是2000000了

作者: liwangli1983   发布时间: 2010-07-29

到底是ptr2的值,还是*ptr2?如果是ptr2那就是那个数组其中一个元素的地址,那是分配恰好为20000很奇怪吗?

作者: wohenry84   发布时间: 2010-07-29

回复 zylthinking


    汗。。。
小弟愚钝,多谢指点

作者: kitifaye   发布时间: 2010-07-29



QUOTE:
到底是ptr2的值,还是*ptr2?如果是ptr2那就是那个数组其中一个元素的地址,那是分配恰好为20000很奇怪吗?
wohenry84 发表于 2010-07-29 10:16




    题中写的是 *ptr2。。。。。。

作者: kitifaye   发布时间: 2010-07-29

回复 liwangli1983


    多谢您详细的指点,灰常感谢!

作者: kitifaye   发布时间: 2010-07-29



QUOTE:
回复  liwangli1983


    多谢您详细的指点,灰常感谢!
kitifaye 发表于 2010-07-29 10:29




作者在这里实际想要说明的就是给指针加1不等于给指针所代表的地址值加1

作者: liwangli1983   发布时间: 2010-07-29

回复 liwangli1983


    我一直以为了2后面三个0是属于高端的,从低到高是 0002000,所以结果是2000

作者: kitifaye   发布时间: 2010-07-29

little endian的机器吧

第一个输出0X 5,第二个应该是0X 2 00 00 00
去掉空格

作者: okocha-jay   发布时间: 2010-07-29

简单画了个图...

下载 (15.73 KB)
2010-07-29 10:58

作者: wmmy2008   发布时间: 2010-07-29

相关阅读 更多

热门下载

更多