C 语言及应用 中专 教学课件 ppt 作者 孙振业 第5-7章 第7章

上传人:E**** 文档编号:89344208 上传时间:2019-05-23 格式:PPT 页数:229 大小:3.64MB
返回 下载 相关 举报
C 语言及应用 中专 教学课件 ppt 作者 孙振业 第5-7章 第7章_第1页
第1页 / 共229页
C 语言及应用 中专 教学课件 ppt 作者 孙振业 第5-7章 第7章_第2页
第2页 / 共229页
C 语言及应用 中专 教学课件 ppt 作者 孙振业 第5-7章 第7章_第3页
第3页 / 共229页
C 语言及应用 中专 教学课件 ppt 作者 孙振业 第5-7章 第7章_第4页
第4页 / 共229页
C 语言及应用 中专 教学课件 ppt 作者 孙振业 第5-7章 第7章_第5页
第5页 / 共229页
点击查看更多>>
资源描述

《C 语言及应用 中专 教学课件 ppt 作者 孙振业 第5-7章 第7章》由会员分享,可在线阅读,更多相关《C 语言及应用 中专 教学课件 ppt 作者 孙振业 第5-7章 第7章(229页珍藏版)》请在金锄头文库上搜索。

1、第7章 指 针,7.1 指针的概念 7.2 变量的指针与指针变量 7.3 指针与数组 7.4 指针与函数 7.5 指针与结构 7.6 结构与链表 7.7 应用举例 习题7,7.1 指 针 的 概 念,7.1.1 指针 一个程序的指令、 常量和变量都要存放在计算机的内存中, 计算机的内存是按字节(B)来划分存储单元的, 每一个字节都有一个编号, 称为存储单元的地址。 每个地址中所存放的数据, 称为存储单元的内容。在计算机内部, 根据内存的“地址”即可访问存储单元的“内容”,即按地址读写存储单元的数据。,图7-1 地址与内容,例如,图7-1中,2000是存储单元的地址,40是以2000为地址的存储

2、单元的内容,根据地址2000即可访问它的内容40。 在C语言中,指针是用于定位其它数据对象的一种数据类型,它包含了所指数据对象的地址。C语言规定, 指针既可以指向各种简单的基本类型变量,也可以指向复杂的构造类型变量, 变量的指针即是该变量的地址。,7.1.2 指针变量 1. 指针变量 有了指针数据类型,用户可定义指针数据类型的变量, 简称为指针变量。指针变量是专门用来存放地址的变量, 一个指针变量的内容一定是另一个变量在内存中的“地址”。因此,一个指针变量用于指向另一个变量, 存放该变量的地址。 例如, 图7-2中,ip是指针变量, 它表示变量i的地址3000。,2. 变量的指针 变量的指针是

3、指向该变量的“地址”。 例如, 图7-2中, 变量i的地址是3000, 也可称变量i的指针是3000。,图7-2 指针变量与所指变量的关系,7.1.3 指针运算符 1. 取地址运算符“&” “&”运算符与一个变量连用可得到该变量的地址, 从而 把一个变量与一个指针变量联系起来。 取地址运算的一般形式如下: &变量名 其中, 变量名可以是简单变量名, 也可以是结构体成员名或数组元素名。,例如: 其作用是将变量i的地址赋给指针变量ip,使指针变量ip指向变量i。如果变量i在内存中的地址为3000,则上述赋值语句执行后,ip的值为3000。 如图7-2所示。,2. 指针运算符“*” 有关指针的另一个

4、运算符为“*”, 称为间接访问运算符。 它只能与指针变量连用,运算结果是得到该指针变量所指向变量的值。 间接访问运算的一般形式如下: *指针变量 例如, 如果有以下定义:,间接访问运算的一般形式如下: *指针变量 例如, 如果有以下定义: int i; /*定义i为整型变量*/ int *ip; /*定义ip为指向整型变量的指针变量*/ ip= 则*ip的值也是9。 如图7-2所示。,例如, 以下两个赋值语句的作用是完全相同的: i=90; 表示将整型数据90赋给变量i; *ip=90; 表示将整型数据90赋给指针ip所指向的变量, 即变量i。 又如,a=i+5; 与 a=*ip+5; 的作用

5、完全相同, 也是等价的。 由此可见,对于一个变量既可以通过变量名访问它直接访问; 也可以通过指向它的指针访问它间接访问。,7.1.4 有关指针的使用说明 (1) 取地址运算符只能作用于变量,不能指向表达式、 常量和寄存器变量,因为它们不占用内存单元,因此没有内存单元的地址。 (2) 不能将一个常量赋给一个指针变量, 同样不能将一个指针变量的值赋给一个非指针变量。 例如, 下面的赋值语句是没有意义的: int k, *ip; ip=2000; k=ip;,因为指针变量是专门用来存放地址的变量, 每一个指针变量都指向另一个变量,而整型变量没有这种功能。正确的赋值语句形式如下: *ip=2000;

6、将常量2000赋给ip所指向的变量。 k=*ip; 将ip所指向的变量的值赋给变量k。,(3) C语言规定,指针可以是空指针。空指针的含意是该指针变量不指向任何变量。 可以用赋值语句给一个指针变量赋“空”,使指针变量不指向任何变量。 例如: ip=NULL; 其中,NULL是一个符号常量,在C语言编译系统的标准输入输出头文件stdio.h中,将NULL宏定义为0,即 define NULL 0,(4) 一个指针变量赋值为空与没有赋值, 含义是不同的。 空指针的值为0,表示不指向任何变量; 而指针未赋值, 并不表示指针没有值,此时指针的值是不确定的, 它指向的是存储空间中的一个随机的内存单元。如

7、果此时使用该指针处理数据,可能会改变内存中的有用数据(例如操作系统所占用的存储单元),从而产生意想不到的后果,严重时可能导致系统崩溃。因此, 用户在定义了指针之后,在引用之前一定要给指针变量赋初值。,(5) 在C语言中, 一个指针变量所占用的内存空间是固定的,但其指向的变量所占用的内存空间由变量类型决定。,7.2 变量的指针与指针变量,7.2.1# 指针变量的说明 与其它类型的变量一样, 指针变量也必须先定义后使用。 1. 指针变量定义的一般形式 数据类型 *指针变量名; 其中,“数据类型”是指针变量所指向的变量的类型; *表示定义的变量为指针型变量;指针变量名应符合标识符的构成规则。例如:

8、int i, *ptr1; char ch, *ptr2; float f, *pf;,以上定义了 3 个变量和 3 个指针型变量, 其中ptr1为指向整型数据的指针变量,ptr2为指向字符型数据的指针变量, 而pf为指向实型数据的指针变量。 指针本身并无类型, 但是必须说明它所指向变量的数据类型。,2. 使用赋值语句可以使一个指针变量指向一个相应数据类型的变量 例如: ptr1= 建立指针与所指向的变量之间的联系。即指针变量ptr1指向整型变量i;指针变量ptr2指向字符变量ch;指针变量pf指向实型变量f。,一个指针变量说明了它所指向变量的数据类型之后, 虽然可以对它多次赋值,但是所赋值必

9、须与指针变量的类型一致。 例如上例中,ptr1只能指向整型变量,ptr2只能指向字符型变量, 而pf只能指向实型变量。 如果使用不当将会导致错误。 严格来说,指针仅是一种数据类型,与整型、实型、字符型等一样。上例中的ptr1、ptr2和pf是指针变量,但是习惯上把指针变量简称为指针。如果说pf是一个指针,实际上是说pf是一个指针变量。,7.2.2# 指针变量的引用 指针变量定义之后即可引用。 例7.1 使用指针输出变量的值。 main() int i, *ptr1; float x, *ptr2; i=245; x=23.8; ptr1= ,程序的运行结果如下: I=245 X= 23.80

10、*PTR1=245 *PTR2= 23.80,例7.1程序中定义了两个指针变量, ptr1可以指向整型变量,ptr2可以指向实型变量。程序中ptr1= 的作用是使指针ptr1指向i、 ptr2指向x, 此时指针ptr1和ptr2的值分别为变量i和x的地址。 从例7.1程序的运行结果可以看到,*ptr1和i、 *ptr2和x的值相同, 它们表示同一个变量。 例7.1程序中三次出现ptr1和ptr2, 第一次出现在变量定义区,说明ptr1和ptr2为指针变量;第二次分别取变量i、 x的地址并赋给ptr1、 ptr2; 而在程序最后一行的printf()函数中, 则代表ptr1和ptr2所指向的变量

11、i、 j。,7.2.3 指针的运算 例7.1程序中使用了指针运算符“*”和“ 则 &*ptr1 等价于 &i 因为*ptr1等价于i *&i 等价于 *ptr2 因为&i等价于ptr2,1. 指针的赋值运算 指针定义之后, 必须先赋值后使用, 这一点非常重要。 此外,在给指针赋值时,类型一定要匹配, 否则将产生错误。,例7.2 将变量i的值赋给变量j。 main() int i=36, j; float *p; p= 程序的运行结果如下: Floating point error: Domain.,执行例7.2程序时,产生了一条错误信息, 原因是程序中指针所指向的数据类型与变量的数据类型不匹配

12、。 只要将程序中的指针类型float改为int即可得到正确的结果。,2. 指针的加减运算 如果一个指针指向的是一组类型相同且连续存储的数据(例如数组),则可以对指针进行自增、 自减运算。,例7.3 指针自增、自减运算的应用示例。 main() static int a=23, 45, 43, 32, 65; int *p; p=a; for(; pa+5; p+) printf(“p=%4d, *p=%4d“, p, *p); ,程序的运行结果如下: P= 404, *P= 23 P= 406, *P= 45 P= 408, *P= 43 P= 410, *P= 32 P= 412, *P=

13、65,从例7.3程序的运行结果可以看到,指针p加1并不等于地址值加1。 当指针指向字符型变量时,一个元素占用1个字节,指针变量加1, 则地址值也加1; 当指针指向整型变量时,一个整型变量占用 2 个字节,指针加1相当于地址加2; 当指针指向实型变量时,一个实型变量占用4 个字节, 指针加1相当于地址增加了4。,从例7.3程序还可以看到,将一个数组的地址赋给指针时, 数组名前不允许使用“&”, 因为数组名即代表数组的首地址。 使用指针自增、 自减运算时应注意以下几个问题: (1) 指针的自加、 自减运算只能在指向同一类型数据的指针间进行, 而且所指向的数据必须是连续存储的, 如例7.3所示。 (

14、2) 指针p+是指向下一个元素, 如例7.3所示。 (3) *(p+n)表示指针p之后的第n个元素的值; *p+n表示指针p所指向的内容加n。 这是两个完全不同的概念, 读者千万不要混淆。,例7.4 指针运算的应用示例。 main() static int a5=23, 45, 43, 32, 65; int *p; p=a; rintf(“*p=%d *(p+3)=%d *p+3=%dn“, *p, *(p+3), *p+3); 程序的运行结果如下: *p=23 *(p+3)=32 *p+3=26 其中,*p表示当前元素(即第一个元素),*(p+3)是当前元素之后的第三个元素(即第四个元素)

15、; *p+3是当前元素的值+3。,(4) *(+p)的作用是先进行p=p+1运算, 然后再取*p的值。 例7.5 利用*(+p)控制输出数组元素的值。 main() static int a=23, 45, 43, 32, 65; int *p; p=a-1; for(; pa+4; ) printf(“*(+p)=%4dn“, *(+p); ,程序的运行结果如下: *(+p)= 23 *(+p)= 45 *(+p)= 43 *(+p)= 32 *(+p)= 65 请读者比较例7.5程序与例7.3程序在数组的控制上有什么区别。,(5) 指针*p+中的+和*的优先级相同, 运算顺序是“从左至右”,即执行该语句时,先得到p所指向的变量的值(即*p), 然后再使p自增。 例如, 将例7.3程序中的输出语句改写为如下形式: for(; pa+5; ) printf(“p=%4d, *p=%4dn“, p, *p+); 输出结果完全相同。,指针的自减运算与自加运算的规则相同。将和运算符应用于指针变量十分方便、有效,使用指针变量的自动向前或向后移动,可以存取数组的上或下一个元素的值。但是, 指针运算很容易出错,特别是在先取值还是先加减的问题上, 很容易搞混,因此读者在对指针进行运算时, 一定要细心、 认真。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号