为什么KeilC51下char型指针是3个字节

今天看到有位网友提问:


单片机中的sizeof的问题
是用KEILC51,单片机型号是AT89S52如下程序:char i,k,*p;i=6  ; p=&i; k=sizeof p;DEBUG观察K的值,是0x03请问这是为什么?32位机指针大小是4,那么8位的单片机就应该是1啊”

    在看到这个问题时我也不知道KeilC51下char型指针的长度到底是多少,但肯定不是1。因为如果是1,那寻址空间就只有256,而51单片机的外部数据存储器是可以扩展到地址0xFFFF的。所以,指针变量的长度至少是2字节。另外,这里还要注意,在一个系统中,指针变量的长度跟具体的变量类型是无关的。那么,在KeilC51中指针变量的长度到底是多少呢?是不是像网友说的3个字节呢?

    实践是检验真理的唯一标准,把代码放到KeilC中一试便知。结果:真的是3字节,为什么?以前还从来没注意过这个问题。

image 
image
    从以上两图可看出指针变量p确实分配了3字节空间。我想这肯定是为了寻址的需要,但是问什么系统的PC指针是16bit的呢?16bit的指针寻址空间是64K,如果使用外部扩展RAM,16bit也应该够了啊。难道是为了以后扩展更大的RAM?查看了ATMEL官方的datasheet,在memory部分也没有找到跟多线索。
    接着我有试了使用AT89S51,看到的结果是一样的,也是3字节,看来内部架构应该是一样的。

    最终还是没能搞清楚原因。 不过今天也算高明了一个问题,那就是AT89S51单片机的指针变量是3字节。

分享到: 更多
版权申明:

本站保留所有原创文章的版权,本站地址:奔跑的博客[http://www.elecbench.com]

原创文章转载时请注明出处,并添加文章所在页面的链接:http://www.elecbench.com/%e4%b8%ba%e4%bb%80%e4%b9%88keilc51%e4%b8%8bchar%e5%9e%8b%e6%8c%87%e9%92%88%e6%98%af3%e4%b8%aa%e5%ad%97%e8%8a%82/

本站所有 2010年3月4日 以后发表、未标明为“转载”的文章均是本站原创。

发表评论?

3 条评论。

  1. 8051的指针占用3个字节,其中第一个字节代表“存储器类型”,第二个字节诶代表“高位偏移”,第三个字节代表“低位偏移量”。这下你应该懂为什么占用3个字节了。

    • @皓月
      谢谢!讲得很明白,但是如果变量定义在不同的内存空间,指针的长度是不一样的,这是问什么呢?系统是靠什么区分这个变量的位置的呢?是翻译成汇编时使用了不同的MOV指令,对吗?

  2. 有位朋友给我解释原因:

    char data * pDchar; //指针1字节 MOV A,@Ri
    char xdata * pXchar;//指针2字节 MOVX A,@DPTR
    char * pChar;//指针3字节 MOVC A,@A+DPTR
    好像是char你不指定是它的存储方式的话,它是以最大的值也就是3字节

    应该是这样,表示感谢 😆

发表评论


(设置自己的个性头像)

*

申请属于你的免费顶级域名