<meta name="keywords" content="必胜时时彩开户,keywords" /> 第十六课 C51指针的应用 联系我们

第十六课 C51指针的应用

指针就是指变量或数据所在的存储区地址。如一个字符型的变量 STR 存放在内存单元DATA 区的 51H 这个地址中,那么 DATA 区的 51H 地址就是变量 STR 的指针。在 C 语言中 指针是一个很主要的看法,准确有用的应用指针类型的数据,能更有用的表达严重年夜的数据 结构,能更有用的应用数组或变量,能便利直接的处置赏罚赏罚内存或其它存储区。指针之以是 能这么有用的操作数据,是由于岂论法式模范模范的指令、常量、变量或特殊存放器都要存放在内 存单元或照顾的存储区中,这些存储区是按字节来划分的,每个存储单元都能用唯一的 编号去读或写数据,这个编号就是常说的存储单元的地址,而读写这个编号的行动就叫做寻 址,经由历程寻址便可以会见到存储区中的任一个能会见的单元,而这个功效是变量或数组等 是弗成能取代的。C 语言也是以引入了指针类型的数据类型,专门用来一定其他类型数据的 地址。用一个变量来存放此外一个变量的地址,那么用来存放变量地址的变量称为“指针变量”。 如用变量 STRIP 来存放文章开首的 STR 变量的地址 51H,变量 STRIP 就是指针变量。下面 用一个图表来诠释变量的指针和指针变量两个纷歧样的看法。

变量的指针就是变量的地址,用取地址运算符‘&’取得赋给指针变量。&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 <AT89X51.H> //预处置赏罚赏罚文件外面界说了特殊存放器的称谓如 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。在存储器窗口则能不雅不雅察各地址单元的值。应用这类措施不只在学习时能 赞助更好的明确语法或法式模范模范的使命,而且在现实应用中更能让你更快更准确的编写法式模范模范或解 决法式模范模范中的效果。