指针就是指变量或数据所在的存储区地址。如一个字符型的变量 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语言指针作用,单片机C语言教程:C51指针的使用相关推荐

  1. c语言指针作用一句话,C语言指针是什么?C语言指针的概念。

    计算机中所有的数据必须存放在内存中,不同的类型的数据占用的内存字节也不同,int型占4字节,char型占一字节,为了正确访问这些数据,必须为每个一个自己都编上号码,就像仓库一样,每个仓库都会有自己的编 ...

  2. c语言 定时器作用,单片机定时器的作用及使用方法详解

    单片机定时器的作用及使用方法详解 单片机定时器在单片机的功能是很重要的,它一般被用作定时功能,来做定时检测.定时响应和定时控制,并且可以产生毫秒宽的脉冲信号来驱动步进电机.计时和计数的最终功能是通过计 ...

  3. 计算机c语言的作用,计算机c语言的特性有哪些

    计算机c语言的特性有哪些 C语言是世界上最流行.使用最广泛的高级程序设计语言之一,下面小编为大家介绍关于计算机c语言的特性,欢迎大家阅读! 计算机c语言的特性有哪些 1.C是高级语言: 它把高级语言的 ...

  4. c语言编译作用,叙述 C语言编译

    @(C语言)[code] 用一段简单的代码,探讨下从C代码到最终可执行文件的编译过程,追根究底. 偶尔了解下底层,也就没那么多莫名其妙了. 工作原因有时候会用python写写测试工具,感受到其快速实现 ...

  5. c语言三元组作用,数据结构 C语言 三元组的具体实现

    #include #include //定义常量 方便操作 //可能也没多方便 #define Time 1000 typedef int *Triplet; typedef int Status; ...

  6. stc单片机c语言 pdf,STC单片机C语言程序设计 第13章 STC单片机C语言指针.pdf

    STC单片机C语言指针 主讲:何宾 Email :hebin@mail.buct.edu.cn 2016.03 C51编译器中指针的分类 Cx51编译器支持使用字符"*"声明变量指 ...

  7. 单片机c语言中延时函数的作用,单片机中C语言延时函数

    单片机C语言延时程序计算2009-11-02 22:15单片机C语言延时程序用C语言写出来程序非常的简练,它是一种模块化的语言,一种比汇编更高级的语言,但是就是这样一种语言也还是有它不足之处:它的延时 ...

  8. avr c语言编译器,AVR单片机C语言编译器-20210409071159.docx-原创力文档

    鼓新资料推荐 鼓新资料推荐 炭新精詁资料整理推荐 炭新精詁资料整理推荐?更新"ZC二C毎十二月三十一口 2020年12月31 口星期0 19:24:59 鼓新资料推荐 鼓新资料推荐 炭新精詁 ...

  9. dac梯形波c语言编程,单片机项目第11章单片机与AD接口.ppt-资源下载在线文库www.lddoc.cn...

    单片机项目第11章 单片机与AD接口.ppt 第11章 单片机与AD接口,11.1 项目内容数字电压表的设计 11.2 程序设计 11.3 相关知识,11.1 项目内容数字电压表的设计,11.1.1 ...

最新文章

  1. struts2_对Map进行双层迭代
  2. java jdbc 链接pg_Java零基础教程
  3. 排序之二分查找插入排序算法
  4. 大势至电脑文件防泄密软件_有了数据防泄密软件,还会担心企业文件泄漏吗?...
  5. Mybatis常见面试题总结(详细)
  6. java quartz CronScheduleBuilder
  7. 关于组装电脑装win10不得不说的小故事
  8. linux通用内核,重新编译内核 - Linux通用系统优化大全_Linux教程_Linux公社-Linux系统门户网站...
  9. BeatSaber节奏光剑双手柄MR教程
  10. python算法之罗马数字转换阿拉伯数字
  11. POJ 1008 玛雅日历
  12. docker部署consol 集群
  13. Complementary Trilateral Decoder for Fast and Accurate Salient Object Detection(速读啊)内含与u-shape的对比
  14. MXNet对DenseNet(稠密连接网络)的实现
  15. 5 kyu some egyptian fractions
  16. Java使用aspose批量将PDF转为word
  17. python写api接口实战
  18. Cisco三层交换机配置命令及解释
  19. android 比较符合android构架,优雅的定义全局变量
  20. 玩转NVIDIA Jetson AGX Xavier

热门文章

  1. 华为认证723(自用)
  2. 千牛如何撤销发往服务器的文件,千牛服务器没有返回数据
  3. NullPointerException报错
  4. 从零开发H5可视化搭建项目
  5. 【C语言】计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和。
  6. linux so 文件 执行,Linux .so库的使用
  7. Premiere滤镜全解
  8. 【探花交友DAY 12 完结】推荐系统
  9. 什么是笔记本的南桥和北桥?
  10. mysql修改视图定义_MySQL修改视图