第十六课 C51指针的使用

发布者:熙风细雨最新更新时间:2023-06-07 来源: elecfans关键字:C51  指针  存储器 手机看文章 扫描二维码
随时随地手机看文章

指针就是指变量或数据所在的存储区地址。如一个字符型的变量 STR 存放在内存单元DATA 区的 51H 这个地址中,那么 DATA 区的 51H 地址就是变量 STR 的指针。在 C 语言中 指针是一个很重要的概念,正确有效的使用指针类型的数据,能更有效的表达复杂的数据 结构,能更有效的使用数组或变量,能方便直接的处理内存或其它存储区。指针之所以 能这么有效的操作数据,是因为无论程序的指令、常量、变量或特殊寄存器都要存放在内 存单元或相应的存储区中,这些存储区是按字节来划分的,每一个存储单元都能用唯一的 编号去读或写数据,这个编号就是常说的存储单元的地址,而读写这个编号的动作就叫做寻 址,通过寻址就能访问到存储区中的任一个能访问的单元,而这个功能是变量或数组等 是不可能代替的。C 语言也因此引入了指针类型的数据类型,专门用来确定其他类型数据的 地址。用一个变量来存放另一个变量的地址,那么用来存放变量地址的变量称为“指针变量”。 如用变量 STRIP 来存放文章开头的 STR 变量的地址 51H,变量 STRIP 就是指针变量。下面 用一个图表来说明变量的指针和指针变量两个不一样的概念。

第十六课 C51指针的使用


变量的指针就是变量的地址,用取地址运算符‘&’取得赋给指针变量。&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。在存储器窗口则能察看各地址单元的值。使用这种方法不但在学习时能 帮助更好的了解语法或程序的工作,而且在实际使用中更能让你更快更准确的编写程序或解 决程序中的问题。

第十六课 C51指针的使用


关键字:C51  指针  存储器 引用地址:第十六课 C51指针的使用

上一篇:MCS-51系列单片机各种不用的类型特点介绍
下一篇:C51语言与LCM12864ZK的接口控制技术

推荐阅读最新更新时间:2024-11-17 04:30

ATmega48 堆栈指针
堆栈指针主要用来保存临时数据、局部变量和中断/ 子程序的返回地址。堆栈指针总是指向堆栈的顶部。要注意AVR 的堆栈是向下生长的,即新数据推入堆栈时,堆栈指针的数值将减小。 堆栈指针指向数据SRAM 堆栈区。在此聚集了子程序堆栈和中断堆栈。ATMEGA48 在调用子程序和使能中断之前必须定义堆栈空间,且堆栈指针必须指向高于0xFF 的地址空间。使用PUSH指令将数据推入堆栈时指针减一;而子程序或中断返回地址推入堆栈时指针将减二。使用POP 指令将数据弹出堆栈时,堆栈指针加一;而用RET 或RETI 指令从子程序或中断返回时堆栈指针加二。 AVR的堆栈指针由I/O空间中的两个8位寄存器实现。实际使用的位数与具体器件有关。请注意某些AV
[单片机]
ATmega48 堆栈<font color='red'>指针</font>
存储器产业太强近乎垄断 韩国对华出口不减反增
据韩联社报道,尽管受到“萨德”争端影响,韩国对华出口不减反增,连续5个月保持增势。下面就随嵌入式小吧一起来了解一下相关内容吧。 根据中国海关总署公布的数据,中国3月从韩国进口额为142.59亿美元,同比增长7.3%,环比增长9.8%;中国对韩出口额为93.0229亿美元,同比增长13.7%,环比增长41.8%。自去年11月起,韩国对华出口规模连续5个月保持增势。 韩联社称,由于去年年初开始对华出口萎缩产生的基数效应,以及近来中国经济景气出现良好势头,加上国际油价上升拉动石油制品和原材料出口,促使3月韩国对华出口不减反增。 韩国半导体存储器产业垄断趋势明显 目前韩国半导体存储产业已形成垄断局势,市场集中度极高,内存产业的产品构
[嵌入式]
韩国存储器屹立市场20年带动ICT出口长红
   韩国存储器市场20年来久盛不衰,带动资通讯科技(ICT)出口长红。 8月ICT出口项目中,存储器半导体出口值达30.7亿美元,比前一年同期成长34.5%。韩国存储器两大龙头三星电子(Samsung Electronics)与SK海力士(SK Hynix)第3季财报也可望维持好成绩。   据韩媒ChosunBiz报导,存储器半导体市场20年来久盛不衰,依照世界半导体贸易统计组织(WSTS)的资料,2014年5月DRAM市场规模创下38.5亿美元纪录,为1995年12月以来的最高值。与前一年5月相比也足足增加30%。   DRAM产业指标连续19个月绿灯,并且还在持续。因此韩国存储器两大龙头三星电子与SK海力士,每季都交出令人惊喜
[手机便携]
USB传感器与存储器在数据记录中的应用
  目前市场上有很多种数据采集设备可用于在PC上记录数据,如National Instrument的LabVIEW,不过这类设备的传感器件开始越来越多地采用USB接口而不是RS232或其他传统接口。过去在嵌入式系统中应用USB设备需要性能相对较强的硬件,要带有USB Host控制器接口、RTOS以及USB软件驱动,结果因USB Host功能实施成本的原因设计工程师一直都不太愿意在小型8位或16位MCU系统上增加USB设备。但随着最新一代智能USB Host控制器IC的推出,与MCU配合使用不仅可为PC应用使用USB数据采集设备,而且还可将数据存储在低成本高容量的闪存盘上。   数据记录应用   第一个应用实例显示了一个MCU控制
[嵌入式]
存储器即将实现国产化,三星独大的局面可望被中国打破
  在春节长假期,国人欢庆佳节的时候, 长江存储 的工厂依然在加紧建设,以确保今年三季度投产NAND flash,随着 长江存储 投产,中国可望打破当前三星在NAND flash行业独大的局面。下面就随手机便携小编一起来了解一下相关内容吧。   存储器即将实现国产化,三星独大的局面可望被中国打破   据介绍 长江存储 正在建设的NAND flash 存储器 工厂包括了三座全球洁净面积最大NAND flash生产厂房,投资额高达240亿美元,春节期间正在进行洁净室装修和空调、消防等系统安装,计划在4月份搬入机台设备,三季度开始正式投产。   当前全球NAND flash市场五大巨头分别是三星、东芝、西部数据、美光、SK海力士,
[手机便携]
存储器的操作
@************************************************************************* @ File:head.S @ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行 @************************************************************************* .equ MEM_CTL_BASE, 0x48000000 .equ SDRAM_BASE, 0x30000000 .text .global _start _
[单片机]
C51-全双工串行通信
全双工串行通信
[单片机]
C51-全双工串行通信
iSuppli降低半导体市场收入预测,存储器市场发展减缓是祸首?
市场研究机构iSuppli公司指出,全球半导体市场销售收入将在2007年达到2814亿美元,比去年的2602亿美元增长8.1%,但低于该公司之前预测的10.6%。 iSuppli公司将之归结于各种因素,包括手机销量增长速度的减缓、长期存在的库存过多问题以及存储器市场的大幅度减速。iSuppli公司首席分析师Gary Grandbois表示,最大的原因在于DRAM市场销售额没有达到之前预计的水平。2006年DRAM市场达到了顶峰,销售收入较2005年增长了35.2%,达到了3390万美元。 他认为,如此意外的强势增长之后,将是一次大减速,预计2007年该市场销售收入将仅增长8.6%,达到3690万美元。Grandbois指出,之
[焦点新闻]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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