(玩电子) 电子技术学习与研讨
当时方位:单片机教程网 >> 根底教程 >> 阅览文章

第十六课 C51指针的运用

作者:佚名   来历:本站原创   点击数:x  更新时刻:2007年07月12日   【字体:

指针便是指变量或数据地点的存储区地址。如一个字符型的变量 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 的软件仿真器检查各变量和存储器的

值。编译程序并履行,然后翻开变量窗口,如图。用单步履行,就能查到到指针的变量。 如图中所示的是程序中循环履行到第2次,这个时分指针 dsi 指向 c:0x0004 这个地址,这个地址 的值是 0xFE。在存储器窗口则能观察各地址单元的值。运用这种办法不光在学习时能 协助更好的了解语法或程序的作业,并且在实际运用中更能让你更快更精确的编写程序或解 决程序中的问题。


 

宣布谈论】【告知老友】【保藏此文】【封闭窗口

文章谈论

相关文章

m88 188bet uedbet 威廉希尔 明升 bwin 明升88 bodog bwin 明升m88.com 18luck 188bet unibet unibet Ladbrokes Ladbrokes casino m88明升 明升 明升 m88.com 188bet m88 明陞 uedbet赫塔菲官网 365bet官网 m88 help
188bet www.188bet.com bwin 平博 unibet 明升 188bet uk Ladbrokes 德赢vwin 188bet m88.com w88 平博88 uedbet体育 188bet 188bet 威廉希尔 明升体育app 平博88 M88 Games vwin德赢 uedbet官网 bodog fun88 188bet