![](https://csdnimg.cn/release/download_crawler_static/3732893/bg4.jpg)
3
这种方式速度慢,产生的代码也最多,而且对于需要频繁运算的变量,效率更低。
指针
指针指针
指针
通用指针以标准 C 指针的方式声明,如:
通用指针总是以三字节进行存储,第一个字节是存储器类型
存储器类型存储器类型
存储器类型,第二字节是指针代表的地
址的高字节,第三字节是地址的低字节。通用指针的好处就是可以访问 8051 存储器空间中
任何存储器区域中的变量,因为这个原因,很多 Cx51 库例程使用这种指针类型。
存储器专用
存储器专用存储器专用
存储器专用指针
指针指针
指针就是在指针声明的时候,指定对应存储器类型,如:
由于存储器类型在编译期指定了,通用指针需要的存储器类型字节就不再需要了,而且,
通用指针的指针地址部分必须取所有指针类型中最长的,2 个字节,而存储器专用指针则根
据实际的指针类型确定指针大小,对于 idata, data, bdata, 和 pdata 是一个字节,对于 code
和 xdata 是两字节,这样可以加快速度和减少代码,用于函数参数的传递时候效果更佳。
这里需要澄清两个概念:存储器专用指针,和位于特定存储区中的指针变量,前着是指
指针的值(地址)指向的特定存储区的,后者是指指针本身(指针本身也是一个变量,只不
过其值是个地址)存放在特定的存储区域,看下面的例子
函数
函数函数
函数
参数传递
参数传递参数传递
参数传递
经典 8051 的堆栈指针只是以间接方式访问片内数据存储器,因此可以使用整个片内 256
字节的存储器。8051 的堆栈指针是向上增长的(即 PUSH 指令执行时是先增加栈指针 SP,
与 x86 相反),C51 编译器把堆栈指针初始化到紧邻片内存储器所有变量之后的位置。
由于堆栈空间最多为 256 字节,实际上还远小于这个值,因此 C51 编译器并不使用堆
char *s; /* string ptr */
int *numptr; /* int ptr */
long *state; /* Texas */
char data *str; /* ptr to string in data */
int xdata *numtab; /* ptr to int(s) in xdata */
long code *powtab; /* ptr to long(s) in code */
char data *str; /* 指向位于 data 空间的字符类型,指针本身的位置没说明,依
据编译采用的存储器模型 */
char data * xdata str; /* 指向位于 data 空间的字符类型,指针本身位于 xdata 中 */