Chinaunix首页 | 论坛 | 博客

Go

  • 博客访问: 220304
  • 博文数量: 67
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 783
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-12 16:29
文章分类

全部博文(67)

文章存档

2015年(1)

2014年(47)

2013年(19)

我的朋友

分类: LINUX

2013-10-22 11:04:37

原创:kylin_zeng; http://blog.chinaunix.net/uid/23795897.html
首先,再此非常感谢蔡哥的指导啊,困扰已久的指针类型的转换等问题终于拨云见日啦。

进入正题:对于一个32位的系统中,如果定义 int *p;p=0x8000 0000 ;因为p指针是4个字节的,所以其实可以看成是:
数组行的,p[0]=0x8000 0000 ,p[1]=0x8000 0001 ,p[2]=0x8000 0002 ,p[3]=0x8000 0003, 因此如果p++的话,那么下一个指针指向的就是0x8000 0004 了。
那么如果定义成char*p;p=0x8000 000;那么同理。换成数组的形式,因为char只有一个字节那么就只有,p[0]=0x8000 0000;那么执行p++的时候,就变成p=0x8000 0001;

例子:
如果unsigned int * p=0x1c6 9000,int addr=0x04;那么p+addr=0x1c6 9010;
如果unsigned int * p=0x1c6 9000,int addr=0x08;那么p+addr=0x1c6 9020;
为什么呢?因为,p是int型,占四个字节,int addr=0x04也要换算成int型的这样才能对齐。那么int是四个字节,则0x04实际上占有了4*4=16个字节,addr总共占用16个字节。 转成16进制位0x10,则,0x1c6 9000+0x10=0x1c6 9010;
阅读(426) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~