打印

菜鸟谈两种指针

[复制链接]
1543|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiyiche|  楼主 | 2009-4-1 01:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    以前学标准C,最近对KEIL C学习得比较多,遇到原来指针也有两种类型。在这里谈谈我对指针的一点浅薄理解,算是理一理自己的思路,也算是让高手来看看自己的理解对不对。

    KEIL C的指针分为两种,1,一般指针;2,基于寄存器的指针。
一般指针和基于寄存器的指针两者定义的区别在于char (xdata) *data ptr里面xdata(当然也可以是idata,data等)这个关键字所在的位置是否是空的,也就是说char xdata * data ptr是一个基于寄存器的指针,表示ptr是一个存放在data(内部寄存器)中的指向xdata(外部寄存器)中的一个char型变量。而char  * data ptr则为一般指针,其表示一个存放在data(内部寄存器)中的指向char的指针,至于这个char存放在什么地方,定义中没特别指出。
    也正因为定义时一般指针没特别指出所指向的地址位于内部还是外部,即不知道指向的变量的偏移地址是8位还是16位,所以一般指针在被定义时,为保险起见,编译器会为其分配16位(2个字节)的空间来存放偏移地址。因此一般指针所占空间为3个字节,其中第一个字节表示所指向的地址的类型(1表示idata,2表示xdata,3表示pdata,4表示data,5表示code),第二,三个字节表示偏移地址的高地位。
    而基于寄存器的指针因为在定义时已由程序员明确指出其所指向的地址的类型(如上面的例子,char存放在xdata中已经明确指出),因此编译器就可以根据其类型为其只分配一个字节(data,idata,pdata)或两个字节(xdata,code)来存放偏移地址,而无需另外用一个字节(如一般指针中的第一字节)来表示其类型。所以基于寄存器的指针只需一个(data,idata,pdata类型时)或两个字节(xdata,code类型时)的长度即可。
    两种指针的总结:因此,在写程序时,如果能明确知道该指针要指向谁,最好用基于寄存器的指针来定义,即在定义时明确说明指针所指向的地址是什么类型。

相关帖子

沙发
computer00| | 2009-4-1 02:34 | 只看该作者

建议楼主将寄存器的概念和地址类型的概念区分开来

明确指定所指向地址类型的指针



没有明确指定所指向地址类型的指针

使用特权

评论回复
板凳
jiyiche|  楼主 | 2009-4-1 15:20 | 只看该作者

恩,谢谢楼上的

我已经改正了。
其实当时我只是认为,可以把指针所指向的地址,看做一个虚拟的寄存器,以后往该地址写值,就是往一个寄存器上写值一样。
如unsigned char xdata IOPORT _at_ 0x0001;相当于引一根指针指向0001叫0001,以后IOPORT自然就成为一个寄存器了。等于给单片机提供一个外部寄存器。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

176

主题

484

帖子

0

粉丝