• 3
  • 11月

话说,C语言中最精髓的就是指针的操作了。当然,本文不对C语言的指针做详细的描述。Hanny在这里只想小结一下KeilC中的指针类型。

在KeilC中,我们会常见到下述的指针定义方式:
char *ptr1;<br />
char code *ptr2;<br />
char data *ptr3;<br />
char xdata *ptr4;<br />
char *data ptr5;<br />
char code *data ptr6;<br />
char data *data ptr7;<br />
char xdata *data ptr8;<br />
char *xdata ptr9;<br />
char code *xdata ptr10;<br />
char data *xdata ptr11;<br />
char xdata *xdata ptr12;


看到这里,可能会有人有点乱了吧。其实要理清上面这一堆东西很简单。

首先,我们需要了解51的内存结构。简单地说,就是51包括data/idata、xdata、code三大块。定义指针时,*后面的修饰符是用来表示指针的存储位置。如:ptr5、ptr6、ptr7、ptr8存储在data区中,ptr9、ptr10、ptr11、ptr12存储在xdata中。ptr1、ptr2、ptr3、ptr4的存储位置则取决于KeilC中的设置(使用内存的模式)。

*之前的修饰符,则是用来表示指针所指向的数据的存储位置,即指针类型。ptr2、ptr6、ptr10的指针,指向一个存储在code中的数据。ptr3、ptr7、ptr11的指针,指向一个存储在data中的数据。ptr4、ptr8、ptr12的指针,指向一个存储在xdata中的数据。

ptr1、ptr5、ptr9这三个指针有一点点特殊。没有修饰类型这表示这是一个通用指针,它将用3Byte来表示。其中第一字节表示指针类型,后两个指针存放指针地址。而类型中,0xff表示指针存放在code中,0x00表示data/idata,0x01表示xdata。

综上所述,若一个指针为char xdata * xdata,如ptr12,则该指针表示一个存放在xdata中的指针,并且该指针指向一个xdata的数据。

在使用过程中,只要注意到了这些类型,应该是不会出什么问题的。