原创: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;
阅读(461) | 评论(0) | 转发(0) |