首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

C51指针定义及应用

C51指针定义及应用

一. 指针变量的定义

指针变量定义与一般变量的定义类似,其形式如下:

数据类型 [存储器类型1] * [存储器类型2] 标识符;



[存储器类型1] 表示被定义为基于存储器的指针,无此选项时,被定义为一般指针。这两种指针的区别在于它们的存储字节不同。一般指针在内存中占用三个字节,第一个字节存放该指针存储器类型的编码(由编译时由编译模式的默认值确定),第二和第三字节分别存放该指针的高位和低位地址偏移量。存储器类型的编码值如下:





















存储类型I


Idata/Data/Bdata


Xdata


Pdata


Code


编码值


0x00


0x01


0xFE


0xFF


[存储类型2]用于指定指针本身的存储器空间。



  • Char * C_ptr; Int * I_ptr; Long * L_ptr;

    上述定义的是一般指针,C_ptr指向的是一个Char型变量,那么这个Char型变量位于哪里呢?这和编译时由编译模式的默认值有关,

    如果Menory Model—Variable—Large:XDATA,那么这个Char型变量位于Xdata区:

    如果Menory Model—Variable—CompactDATA, 那么这个Char型变量位于Pdata 区:

    如果Menory Model——Variable——SmallATA,那么这个Char型变量位于Data区。

    而指针C_ptr, I_ptr, L_ptr变量本身位于片内数据存储区中。


  • Char * Data C_ptr; Int * Idata I_ptr; Long * Xdata L_ptr;

    上述定义,C_ptr, I_ptr, L_ptr变量本身分别位于Data ,Idata,Xdata区。


  • Char Data * C_ptr; //表示指向的是Data区中的Char型变量,C_ptr在片内存储区中;

    Int Xdata * I_ptr; //表示指向的是Xdata区中的Int型变量,I_ptr在片内存储区中;

    Long Code * L_ptr; //表示指向的是Code区中的Long型变量,L_ptr在片内存储区中;


  • Char Data * Data C_ptr; //表示指向的是Data区中的Char型变量,C_ptr在片内存储区Data中;

    Int Xdata * Idata I_ptr; //表示指向的是Xdata区中的Int型变量,I_ptr在片外存储区Xdata中;

    Long Code * Xdata L_ptr; //表示指向的是Code区中的Long型变量,L_ptr在片内存储区Xdata中;


二. 指针应用



  • Int X, J;

    Int * Px, *Py;

    Px=&X; Py=&Y;


  • *Px=0; Py=Px;


  • *Px++<=>*(Px++)


  • (*Px)++<=>X++


  • Unsigned Char Xdata * X;

    Unsinged Char Xdata * Y;

    X=0x0456;

    *X=0x34 //等价于 Mov Dptr,#456h ; Mov A,#34h; Movx @Dptr,A


  • Unsigned Char Pdata * X;

    X=0x045;

    *X=0x34 //等价于 Mov R0,#45h ; Mov A,#34h; Movx @R0,A


  • Unsigned Char Data * X;

    X=0x30;

    *X=0x34 //等价于 Mov A,#34h; Mov 30h ,A


  • Int *Px;

    Px=(Int Xdata *)0x4000; //将 Xdata 型指针 0x4000 赋给 Px,也就是将0x4000强制转换为指向Xdata区中的Int型变量的指针,将其赋给Px。


  • Int X;

    X=*((Char Xdata *)0x4000); //将0x4000强制转换为指向Xdata区中的Int型变量的指针,从这个地址中取出值赋给变量X。


  • Px=*((Int Xdata * Xdata *)0x4000); //如何分析?


  • Px=*((Int Xdata * Xdata *)0x4000);将阴影部分遮盖,这个意思就是将0x4000强制转换为指向Xdata区中的X型变量的指针,这个X型变量就是阴影“Int Xdata *”,也就是0x4000指向的变量类型是一个指向Xdata区中的Int型变量的指针,即0x4000中放的是另外一个指针,这个指针指向的是Xdata区中的Int型变量。Px值放的是0x4000中放的那个指针。比如【0x4000】—【0x2000】-0x34。Px=0x2000。


  • X=**((Int Xdata * Xdata *)0x4000); X中放着0x4000中放的那个指针所指向的值。比如【0x4000】—【0x2000】-0x34。


三. 指针与数组



  • Int Arr[10];

    Int * Pr;

    Pr=Arr; // 等价于Pr=&Arr[0];

    这样的话,*(Pr+1)==Arr[1]; *(Pr+2)==Arr[2]; *(Arr+3)==Arr[3]; *(Arr+4)==Arr[4];

    或者 Pr[0],Pr[1]….代表 Arr[0],Arr[1]…..

    可以*Pr++ (等价于*(Pr++)),来访问所有数组元素,而*Arr++是不行的。因为Arr是常量,不能++运算


  • Char * S1

    Char Code Str[]=”Abcdefg”

    S1=Str;


  • Char *S1=”Abcdefg”;
返回列表