C求解
时间:2010-07-29
来源:互联网
各位大牛,小弟学习C语言深度剖析时,有一段
- #include <stdio.h>
-
- int main()
- {
- int a[5]={1,2,3,4,5};
- int *ptr1=(int*)(&a+1);
- int *ptr2=(int*)((int)a+1);
-
- printf("%x\n%x\n",ptr1[-1],*ptr2);
-
- return 0;
- }
一直未能想明白
小弟菜鸟,求指点
谢谢
作者: kitifaye 发布时间: 2010-07-29
作者: zylthinking 发布时间: 2010-07-29
这题涉及到了对指针和大小端的理解.如果上面两个都明白的话,画个图算一下就明白了
数组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
作者: wohenry84 发布时间: 2010-07-29
汗。。。
小弟愚钝,多谢指点
作者: kitifaye 发布时间: 2010-07-29
wohenry84 发表于 2010-07-29 10:16
题中写的是 *ptr2。。。。。。
作者: kitifaye 发布时间: 2010-07-29
多谢您详细的指点,灰常感谢!
作者: kitifaye 发布时间: 2010-07-29
多谢您详细的指点,灰常感谢!
kitifaye 发表于 2010-07-29 10:29
作者在这里实际想要说明的就是给指针加1不等于给指针所代表的地址值加1
作者: liwangli1983 发布时间: 2010-07-29
我一直以为了2后面三个0是属于高端的,从低到高是 0002000,所以结果是2000
作者: kitifaye 发布时间: 2010-07-29
第一个输出0X 5,第二个应该是0X 2 00 00 00
去掉空格
作者: okocha-jay 发布时间: 2010-07-29

作者: wmmy2008 发布时间: 2010-07-29
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28