指针变量的定义与一般变量的定义类似,其一般形式如下:
数据类型[存储器类型1]*[存储器类型2]标识符;
其中“标识符”是所定义的指针变量名。“数据类型”说明了该指针变量所指向的变量的类型。“存储器类型1”和“存储器类型2”是可选项,它是Keil Cx51编译器的一种扩展。
有“存储器类型1”选项,指针被定义为基于存储器的指针;无此选项时,被定义为一般指针。这两种指针的区别在于它们的存储字节不同。一般指针在内存中占用3个字节,第一个字节存放该指针存储器类型的编码(由编译时编译模式的默认值确定),第二个和第三个字节分别存放该指针的高位和低位地址偏移量。
“存储器类型2”选项用于指定指针本身的存储器空间。
一般指针可用于存取任何变量而不必考虑变量在51单片机存储器空间的位置,许多C51库函数采用了一般指针,函数可以利用一般指针来存取位于任何存储器空间的数据。
如果在定义一般指针时带有“存储器类型2”选项,则可指定一般指针本身的存储器空间位置,例如:
char*xdata strptr; //位于xdata空间的一般指针
int*data numptr; //位于data空间的一般指针
long*idata varptr; //位于idata空间的一般指针(https://www.xing528.com)
由于一般指针所指对象的存储器空间位置只有在运行期间才能确定,编译器在编译期间无法优化存储方式,必须生成一般代码以保证能对任意空间的对象进行存取,因此一般指针所产生的代码运行速度较慢,如果希望加快运行速度,则应采用基于存储器的指针。基于存储器的指针所指对象具有明确的存储器空间,长度可为1个字节(存储器类型为idata、data、pdata)或2个字节(存储器类型为code、xdata)。例如:
char data*str; //指向data空间char型数据的指针
int xdata*numtab; //指向xdata空间int型数据的指针
long code*powtab; //指向code空间long型数据的指针
与一般指针类似,若定义时带有“存储器类型2”选项,则可指定基于存储器的指针本身的存储器空间位置,例如:
char data*xdata str; //指向data空间char数据的指针,指针本身在xdata
int xdata*data numtab; //指向xdata空间int型数据的指针,指针本身在data
long code*idata powtab; //指向code空间long型数据的指针,指针本身在idata
基于存储器的指针长度比一般指针短,可以节省存储器空间,但它所指对象具有确定的存储器空间,缺乏灵活性。基于存储器指针主要的优点是可以显著地提高C51程序的运行速度。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
