历史上的今天

今天是:2026年04月13日(星期一)

正在发生

2023年04月13日 | 单片机c语言教程第十六章--C51指针的使用

发布者:大头玩家 来源: elecfans关键字:单片机  c语言  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 //预处理文件里面定义了特殊寄存器的名称如 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。在存储器窗口则能察看各地址单元的值。使用这种方法不但在学习时能 帮助更好的了解语法或程序的工作,而且在实际使用中更能让你更快更准确的编写程序或解 决程序中的问题。



关键字:单片机  c语言  C51  指针 引用地址:单片机c语言教程第十六章--C51指针的使用

上一篇:C51单片机对液晶片的驱动
下一篇:最后一页

推荐阅读

三星首款预装Android 8.0系统的廉价手机Galaxy J7 Duo即将发布,在之前大量爆料传出之后,现在该机已经现身三星印度的网站。三星官网给出了Galaxy J7 Duo的外观渲染图,不出所料,Galaxy J7 Duo看起来跟其它的廉价三星手机很像,其主要亮点是后面搭载了两个摄像头。官网还显示,Galaxy J7 Duo采用了AMOLED显示屏,后置双摄像头是一个1300万像素和...
韩国三大通讯商KT、SK电信和LG Uplus原本打算在4月5日推出手机网络。不过因为得到了美国威瑞森电信(Verizon)即将“抢跑”的消息,韩国人果断提前2天出手了。 当地时间4月3日晚上11点,SK电信和KT同时宣布开通5G手机网络服务。 这比大洋彼岸的美国人提前了1小时,韩国人就此“反败为胜”,摘下“全球第一”的桂冠 在韩国领先美国1小时“抢跑”开通...
随着自动驾驶技术不断迭代,数据的重要性逐步凸显。4月13日,AutoX宣布其在上海嘉定区汽车城建立的无人车运营大数据中心正式投入使用,为中国首个无人驾驶“超级数据工厂”。据了解,运营大数据中心主要由大量自动驾驶车与仿真大数据云平台两部分构成。前者可通过路测收集大量真实世界数据,后者则可根据前者的真实数据进行加工、压缩、自动标注等举措,生...
“我买的手机128GB闪存,但打开一看可用空间只有112GB,那是不是应该只收112GB的钱,还是说收128GB的钱就是合理的?”近日,知名相声演员岳云鹏在微博上的这一番吐槽,引起了不少网友的热议。有朋友趁机调侃,“脸大,导致人脸识别占地儿了”;同时也有的朋友正经的科普,告知其手机系统与预装软件都得占用存储空间的道理。纵观岳云鹏及诸位网友的发言,给...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved