51单片机中 指针 占用的字节长度

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


指针类型解读

1. 指针指向的数据的存储在data/idata

代码如下(示例):

unsigned char data tmp[10]={
    
    0,1,2,3,4,5,6,7,8,9};	/* tmp是定义在data区(片内RAM直接寻址区 00H~7FH)的数组 */
unsigned char data * data pstr1			= tmp;		/* pstr1本身在data内,指向的数据也在data内 */
unsigned char data * pdata pstr2		= tmp;		/* pstr2本身在pdata内,指向的数据也data内 */
unsigned char data * xdata pstr3		= tmp;		/* pstr3本身在xdata内,指向的数据也data内 */

Note:

  • 指针 pstr1、pstr2和pstr3均占用1个字节
  • 将上面的data换成idata,效果相同

2. 指针指向的数据的存储在pdata

代码如下(示例):

unsigned char pdata tmp[10]={
    
    0,1,2,3,4,5,6,7,8,9};	/* tmp是定义在data区(片内RAM直接寻址区 00H~7FH)的数组 */
unsigned char pdata * data pstr1		= tmp;		/* pstr1本身在data内,指向的数据也在pdata内 */
unsigned char pdata * pdata pstr2		= tmp;		/* pstr2本身在pdata内,指向的数据也pdata内 */
unsigned char pdata * xdata pstr3		= tmp;		/* pstr3本身在xdata内,指向的数据也pdata内 */

Note:

  • 指针 pstr1、pstr2和pstr3均占用1个字节
  • 将上面的data换成idata,效果相同
  • pdataxdata的第一页(256Byte),可以不使用dptr访问

3. 指针指向的数据的存储在xdata

代码如下(示例):

unsigned char xdata tmp[10]={
    
    0,1,2,3,4,5,6,7,8,9};	/* tmp是定义在data区(片内RAM直接寻址区 00H~7FH)的数组 */
unsigned char xdata * data pstr1		= tmp;		/* pstr1本身在data内,指向的数据也在xdata内 */
unsigned char xdata * pdata pstr2		= tmp;		/* pstr2本身在pdata内,指向的数据也xdata内 */
unsigned char xdata * xdata pstr3		= tmp;		/* pstr3本身在xdata内,指向的数据也xdata内 */

Note:

  • 指针 pstr1、pstr2和pstr3均占用2个字节
  • 将上面的data换成idata,效果相同

4. 不指定数据类型(即data/idata/pdata/xdata)

代码如下(示例):

unsigned char tmp[10]={
    
    0,1,2,3,4,5,6,7,8,9};	/* tmp是定义在data区(片内RAM直接寻址区 00H~7FH)的数组 */
unsigned char *  pstr		= tmp;				/* pstr本身在data内,指向的数据也在data内 */

Note:

  • 指针 pstr占用3个字节
  • 将上面的data换成idata,效果相同
  • 这种情况下,指针和指针指向的数据 存在的位置根据 keil中Memory model("option for target--->Target")指定模式决定

总结

提示:这里做以下总结:

  • 当指明数据存储类型为非xdata时,指针只占用1个Byte;
  • 当指明数据存储类型为xdata时,指针只占用2个Byte;
  • 当不指定数据存储类型时,指针总是占用3个Byte。
  • 如果不考虑执行速度,可以不指定指针存储类型,即:
unsigned char pdata tmp[10];
unsigned char pdata * pstr;
pstr=tmp;
  • 指针存储类型决定了不同的寻址方式,进而决定了寻址速度。速度如下:data>idata>pdata>xdata
  • 指针所指向的数据的类型必须与实际的数据类型相一致,不然会出错。比如:
unsigned char xdata tmp[10];
unsigned char data * data pstr;
pstr=tmp;

实际的数据tmp定义在了 xdata(X:0000H~FFFFH),但是定义的指针 pstr 却只能指向 data(D:00H~7FH)

猜你喜欢

转载自blog.csdn.net/fdcp123/article/details/114264314