一. 指针变量的定义
指针变量定义与一般变量的定义类似,其形式如下:
数据类型 [存储器类型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—Compact DATA, 那么这个Char型变量位于Pdata 区:
如果Menory Model——Variable——Small ATA,那么这个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”;
|