变量的指针就是变量的地址,用取地址运算符‘&’取得赋给指针变量。&STR 就是把 变量 STR 的地址取得。用语句 STRIP = &STR 就能把所取得的 STR 指针存放在 STRIP 指 针变量中。STRIP 的值就变为 51H。可见指针变量的内容是另一个变量的地址,地址所属的 变量称为指针变量所指向的变量。
要访问变量 STR 除了能用‘STR’这个变量名来访问之外,还能用变量地址来访 问。方法是先用&STR 取变量地址并赋于 STRIP 指针变量,然后就能用*STRIP 来对 STR 进行访问了。‘*’是指针运算符,用它能取得指针变量所指向的地址的值。在上图中指针 变量 STRIP 所指向的地址是 51H,而 51H 中的值是 40H,那么*STRIP 所得的值就是 40H。 使用指针变量之前也和使用其它类型的变量那样要求先定义变量,而且形式也相类似,
一般的形式如下:
数据类型 [存储器类型] * 变量名;
unsigned char xdata *pi //指针会占用二字节,指针自身存放在编译器默认存储区,指
向 xdata 存储区的 char 类型
unsigned char xdata * data pi; //除指针自身指定在 data 区,其它同上
int * pi; //定义为一般指针,指针自身存放在编译器默认存储区,占三个字节 在定义形式中“数据类型”是指所定义的指针变量所指向的变量的类型。“存储器类型”
是编译器编译时的一种扩展标识,它是可选的。在没有“存储器类型”选项时,则定义为一
般指针,如有“存储器类型”选项时则定义为基于存储器的指针。限于 51 芯片的寻址范围,
指针变量最大的值为 0xFFFF,这样就决定了一般指针在内存会占用 3 个字节,第一字节存 放该指针存储器类型编码,后两个则存放该指针的高低位址。而基于存储器的指针因为不用 识别存储器类型所以会占一或二个字节,idata,data,pdata 存储器指针占一个字节,code,xdata 则会占二个字节。由上可知,明确的定义指针,能节省存储器的开销,这在严格要求程序 体积的项目中很有用处。
指针的使用方法很多,限于篇幅以上只能对它做一些基础的介绍。下面用在讲述常量时 的例程改动一下,用以说明指针的基本使用方法。
- #include //预处理文件里面定义了特殊寄存器的名称如 P1 口定义为 P1
- void main(void)
- {
- //定义花样数据,数据存放在片内 CODE 区中
- unsigned char code design[]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
- 0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,
- 0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,
- 0xE7,0xDB,0xBD,0x7E,0xFF};
- unsigned int a; //定义循环用的变量
- unsigned char b;
- unsigned char code * dsi; //定义基于 CODE 区的指针
- do{
- dsi = &design[0]; //取得数组第一个单元的地址
- for (b=0; b<32; b++)
- {
- }
- }while(1);
- }
- for(a=0; a<30000; a++); //延时一段时间
- P1 = *dsi; //从指针指向的地址取数据到 P1 口
- dsi++; //指针加一,
复制代码
为了能清楚的了解指针的工作原理,能使用 keil uv2 的软件
仿真器查看各变量和存储器的
值。编译程序并执行,然后打开变量窗口,如图。用单步执行,就能查到到指针的变量。 如图中所示的是程序中循环执行到第二次,这个时候指针 dsi 指向 c:0x0004 这个地址,这个地址 的值是 0xFE。在存储器窗口则能察看各地址单元的值。使用这种方法不但在学习时能 帮助更好的了解语法或程序的工作,而且在实际使用中更能让你更快更准确的编写程序或解 决程序中的问题。
0