第8章指针00001.ppt

上传人:sccc 文档编号:5295518 上传时间:2023-06-23 格式:PPT 页数:24 大小:113.52KB
返回 下载 相关 举报
第8章指针00001.ppt_第1页
第1页 / 共24页
第8章指针00001.ppt_第2页
第2页 / 共24页
第8章指针00001.ppt_第3页
第3页 / 共24页
第8章指针00001.ppt_第4页
第4页 / 共24页
第8章指针00001.ppt_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《第8章指针00001.ppt》由会员分享,可在线阅读,更多相关《第8章指针00001.ppt(24页珍藏版)》请在三一办公上搜索。

1、第8章 指针,指针是变量在计算机或单片机内所占有的存贮区域的地址。C51语言中广泛使用的指针概念是从C语言中继承下来的,利用指针变量不但可以操作各种基本的数据类型和数组等复合数据结构,而且能像汇编语言一样,具有处理单片机内存地址的能力。在C51程序中,访问或修改变量可以通过两种方式来实现。一种是直接访问或修改这块区域的内容来实现的,另一种是先求出变量的地址,然后再通过地址对该变量的值进行访问,这就是本节所要讲解的指针及指针变量。,8.1 地址、指针和指针变量的概念,地址是单片机内存单元的编号。其中内存单元是单片机存储器中的最小存储单位,通常一个字节称为一个内存单元。当为内存单元逐个编号后,便可

2、以根据一个内存单元的编号即可准确地找到该内存单元及其中的数据。指针实际上也是一个地址,其表示的是一个变量在内存中的首地址。单片机中的数据都是存放在存储器中的,不同的数据类型所占用的内存单元数和它的大小有关。在C51语言中,根据数据类型或数据结构的不同,一个变量往往都占有一组连续的内存单元,单用“地址”这个概念并不能很好地描述这个变量,从而引进了“指针”的概念。指针是指向一个数据结构的首地址,因而概念更明确,寻址更方便。,8.2 指针变量的声明,指针变量的声明与一般变量的声明相似,声明指针变量的一般形式为:类型标识符*指针名1,*指针名2,;其中前面的“类型标识符”表示该指针变量所指向的变量的类

3、型,即指针变量的类型。典型的指针变量的声明示例如下:int*p1;/p1是指向整型变量的指针变量char*p2;/p2是指向字符变量的指针变量float*p3;/p3是指向浮点变量的指针变量,8.3 指针变量的赋值,指针变量被声明后可以指向任何同类型的变量。如果定义指针变量时不进行初始化,编译系统不能确定它具体的指向,此时该指针变量被初始化为NULL,它的值为0。这里需要强调的是,未经赋值的指针变量不能在程序中使用,否则将由指针指向错误导致整个程序的混乱。另外,指针变量的赋值只能赋予地址,决不能赋予任何其他数据,否则将引起错误。在C51语言中,不知道变量的具体地址,变量的首地址是由编译系统分配

4、的。为此,C51语言中提供了地址运算符“&”,可以获取变量的首地址。其一般形式如下:&变量名,8.3.1 初始化赋值,假设有指向整型变量的指针变量p和整型变量a,如要把整型变量a的地址赋予p,可以采用初始化赋值,示例如下:int a;int*p=/初始化赋值,&a表示取变量a的首地址,8.3.2 取地址赋值,假设有指向整型变量的指针变量p和整型变量a,如要把整型变量a的地址赋予p,可以采用取地址赋值,示例如下:int a;int*p;p=/利用&a获得变量a的首地址,然后赋值给p,8.3.3 指针之间赋值,把一个指针变量的值直接赋予相同类型变量的另一个指针变量。示例如下:int a=5,b=6

5、;/定义变量和初始化int*p1=/把p1指向的内容赋给p2所指的区域,8.3.4 数组赋值,把数组的首地址赋予指向数组的指针变量。示例如下:int a5,*p;/声明数组以及指针变量p=a;/数组名表示数组的首地址,故可赋予指向数组的指针变量由于数组在内存中是连续存放的,数组的首地址即数组中第一个元素的地址,因此也可写为:p=/声明数组及指针变量并进行初始化赋值,8.3.5 字符串赋值,把字符串的首地址赋予指向字符类型的指针变量。示例如下:char*p;/声明字符型指针变量p=This is a test;/赋值也可以采用初始化赋值的方法写为:char*p=This is a test;这里

6、应注意的是,该语句并不是把整个字符串装入指针变量,而是把存放该字符串的字符数组的首地址装入指针变量。,8.3.6 函数入口赋值,把函数的入口地址赋予指向函数的指针变量。示例如下:int(*pfun)();pfun=fun;/f为函数名在C51语言中,指针变量若不带初始化项,其将被初始化为NULL,其值为0。这一点与一般变量类似。当指针变量的值为零时,表明该指针不指向任何有效数据,此时称为“空指针”。空指针常用于调用一个带有返回指针的函数时,如果返回值为NULL,则指示该函数调用中出现某些错误情况。,8.4 指针变量的引用,指针变量的引用即通过指针变量来间接访问其所指向的变量。引用指针变量需要首

7、先声明该指针变量。与指针变量的引用有关的两个运算符如下:,8.4.1 取地址运算符“&”,取地址运算符“&”用于取变量的地址。取地址运算符是单目运算符,符合自右至左的结合性。在上一小节中,已经使用了&运算符。对指针变量的引用形式为:&变量名其中,在“&”运算符之后跟的变量必须是所要取址的变量。该语句的含义是获得变量在单片机实际内存中的地址。,8.4.2 取内容运算符“*”,取内容运算符“*”用来表示指针变量所指向内存中的数据内容。取内容运算符也是单目运算符,符合自右至左的结合性。对指针变量的引用形式为:*指针变量名其中,在“*”运算符之后跟的变量必须是指针变量。该语句的含义是获得指针变量所指向

8、的单片机内存地址中的数值。这里需要注意的是,取内容运算符“*”和指针变量说明中指针说明符“*”的区别。在指针变量说明中,“*”是类型说明符,表示其后是指针类型的变量。而表达式中出现的“*”则是一个运算符,用来表示指针变量所指向的地址中的数据值。,8.5 指针变量的运算,由于指针变量的特殊性,其可以进行有限的某些运算,例如赋值运算、部分算术运算以及关系运算。在使用指针变量进行运算时,需要注意如下两点:只有指向同一数组的两个指针变量之间才能进行运算,否则运算无意义。指针变量的加减运算只能对数组指针变量进行,对指向其他类型变量的指针变量作加减运算是毫无意义的。对于赋值运算,前面已有介绍。下面介绍指针

9、变量在关系运算和算术运算中的使用。,8.5.1 关系运算,对于指向同一数组的两指针变量进行关系运算,可用来表示它们所指向数组元素之间的关系。例如两个指针变量p和q指向同一数组,则、=、q为真,则表示p处于高地址位置,q处于低地址位置。,8.5.2 算术运算,指针变量和整数可进行简单的加、减运算。假设p是指向数组a的指针变量,开始时指向数组的某个元素,设n为一正整数,则如下运算是合法的:p+n,指针变量指向的位置向后移动n个;p-n,指针变量指向的位置向前移动n个;p+,指针变量指向的位置向后移动1个;+p,首先取指针变量的当前位置,然后将指针变量指向的位置向后移动1个;p-,指针变量指向的位置

10、向前移动1个;-p,首先取指针变量的当前位置,然后将指针变量指向的位置向前移动1个。,8.6 数组指针,数组指针是指向数组的指针变量。变量在内存中存放是有地址的,数组在内存存放也同样具有地址。对数组来说,数组名就是数组在内存存放的首地址。指针变量是用于存放变量的地址,可以指向变量,当然也可执指向数组的首址或数组元素的地址,即指针变量可以指向数组或数组元素。对数组而言,数组和数组元素的引用,也同样可以使用指针变量来完成。下面就分别介绍指针变量与不同类型的数组。,8.6.1 指向一维数组的指针,将一个指针指向一维数组,需要首先定义一个整型数组和一个指向整型的指针变量。int a10;/声明数组in

11、t*p;/声明指针变量p=,8.6.2 指向二维数组的指针,将一个指针指向二维数组,需要首先定义一个二维数组,例如:char a34=a,b,c,d,e,f,g,h,i,j,k,l;这里声明并初始化了一个二维字符型数组,共有3行4列12个元素。在C51语言中,这个二维数组a可以看成是由三个一维数组元素组成:a0、a1、a2。其中每个一维数组元素又是一个包含有4个元素一维数组,分别如下:a0所代表的一维数组所包含的4个元素为a00、a01、a02、a03;a1所代表的一维数组所包含的4个元素为a10、a11、a12、a13;a2所代表的一维数组所包含的4个元素为a20、a21、a22、a23。,

12、8.6.3 指向一个由n个元素所组成的数组指针,在C51语言中,还引入了一个指向由n个元素构成的数组指针。这样可以方便二维数组的处理,其定义格式如下:类型标识符(*指针名)n;其中,类型标识符表示数组指针的类型,指针名即数组指针的变量名。示例如下:int ch34;/定义二维数组int(*p)4;/定义指针p=ch;/指针赋值,8.6.4 指针和数组的关系,在C51语言中,指针和数组有着密切的关系,其使用十分灵活,在使用中需要注意如下两点:任何能由数组和下标完成的操作,也都完全可以用指针和指针的偏移量来实现。在程序中使用指针可使代码更灵活,也可以使程序执行得更快,并使生成的目标代码更小。由于指

13、针和数组的使用十分容易混淆,这里列出它们之间的一些典型关系,以加深读者的理解。对于一维数组以及指针变量,声明示例如下:int a3;int*p;p=a;,8.7 字符指针,字符指针是指向字符类型的指针变量。由于在C51语言中没有字符串变量,只有字符串常量。采用字符指针可以对字符串常量进行操作,即用字符指针指向字符串,然后通过字符指针来访问字符串的存贮区域。在C51语言中,字符串常量是由双引号括起来的一个字符序列,示例如下:Good morning该字符串由13个字符序列组成,其中12个字母和最后一位空字符“0”。在程序执行过程中,C51自动对字符串常量分配一个连续的存储空间,其中按顺序存储字符

14、,最后,系统会自动在字符串的末尾加上空字符“0”。这段连续的存储单元是静态的,在程序运行过程中始终被占用。,8.8 指针数组,指针数组是同一数据类型的指针构成的一个数组。其中,指针数组中的每个元素都是指针变量。指针数组的定义格式如下:类型标识符*数组名整型常量表达式;其中,类型标识符是指针数组的类型,“”内的整型常量表达式为指针数组的大小。根据数组的定义,指针数组中每个元素都为指向同一数据类型的指针。说明:这里需要注意指针数组与数组指针的区别。典型的指针数组的声明示例如下:char*ch10;,8.9 小结,本章首先介绍了C51语言中的指针的使用,主要包括指针的概念、指针变量的声明和赋值。接着,本章详细讲解了指针变量的引用以及运算规则。最后,本章还对几种特殊的指针进行了详细的介绍,主要包括数组指针、字符指针以及指针数组。指针的概念来源于C语言,在程序设计中灵活使用指针可以优化程序设计。因此,熟练掌握本章内容是学习C51语言的基础,同时对以后的C51程序设计工作大有帮助。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号