以前学标准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类型时)的长度即可。 两种指针的总结:因此,在写程序时,如果能明确知道该指针要指向谁,最好用基于寄存器的指针来定义,即在定义时明确说明指针所指向的地址是什么类型。 |