C语言程序设计 教学课件 ppt 作者 刘卫国 贾宗福 沈根海 第8章 指针

上传人:E**** 文档编号:89426204 上传时间:2019-05-25 格式:PPT 页数:68 大小:283KB
返回 下载 相关 举报
C语言程序设计  教学课件 ppt 作者 刘卫国 贾宗福 沈根海 第8章  指针_第1页
第1页 / 共68页
C语言程序设计  教学课件 ppt 作者 刘卫国 贾宗福 沈根海 第8章  指针_第2页
第2页 / 共68页
C语言程序设计  教学课件 ppt 作者 刘卫国 贾宗福 沈根海 第8章  指针_第3页
第3页 / 共68页
C语言程序设计  教学课件 ppt 作者 刘卫国 贾宗福 沈根海 第8章  指针_第4页
第4页 / 共68页
C语言程序设计  教学课件 ppt 作者 刘卫国 贾宗福 沈根海 第8章  指针_第5页
第5页 / 共68页
点击查看更多>>
资源描述

《C语言程序设计 教学课件 ppt 作者 刘卫国 贾宗福 沈根海 第8章 指针》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 刘卫国 贾宗福 沈根海 第8章 指针(68页珍藏版)》请在金锄头文库上搜索。

1、C语言程序设计,中国铁道出版社,2008年1月,高等学校计算机教育系列规划教材,第8章 指 针,第8章 指针 8.1 指针的概念 8.2 指针变量的定义与运算 8.3 指针与数组 8.4 指针与字符串 8.5 指针与函数 8.6 指针数组与指向指针的指针 8.7 指针与动态内存管理 8.8 指针应用举例 本章小结,8.1 指针的概念 指针是C语言的一种数据类型,指针类型变量是用于存放另一个变量地址的变量。在图8-1中,有一个字符型变量c,其值为字符A,存放在单元地址为1000的内存中,而该数据存放的地址1000又存放在内存中地址为2000的单元中。要取出变量c的值A,既可以通过使用变量c直接访

2、问,也可以通过变量pc间接访问。,间接访问变量c的方法是:从地址为2000的内存单元中,先找到变量c在内存单元中的地址1000,再从地址为1000的单元中取出c的值A,这种对应关系如图8-1所示。,图8-1 间接访问变量c,若将地址为2000的内存单元分配给变量pc,地址2000存放变量c的地址,则称pc为指针变量,指针变量(简称为指针)pc指向变量c,也称作指针变量pc所指的对象是变量c。变量c的值为字符A,指针变量pc的值为地址1000,而指针变量pc所指对象的内容为字符A。,8.2 指针变量的定义与运算 8.2.1 指针变量的定义 指针变量定义的形式为: 类型符 *指针变量名; 其中,类

3、型符表示该指针变量能指向的对象的类型。指针变量用标识符命名,指针变量名之前的符号*,表示该变量是指针变量。指针变量也具有类型,其类型是指针变量所指对象的类型,并非指针变量自身的类型。语言中允许指针指向任何类型的对象,包括指向另外的指针变量。,像一般的简单类型变量定义一样,指针变量定义时也可指定初值。如: int j; int *pt= 在定义指针变量pt时,给它初始化为变量j的地址。 在C语言中,当定义局部指针变量时,如未给它指定初值,则其值是不确定的。通过其值不确定的指针变量引用其他变量会引起意想不到的错误。程序在使用它们时,应首先给它们赋值。,为明确表示一指针变量不指向任何变量,在C语言中

4、,约定用0值表示这种情况,记为NULL(在stdio.h文件中给出NULL的宏定义:#define NULL (0))。也称指针值为0的指针变量为空指针。对于静态的指针变量,如在定义时未给它指定初值,系统自动给它指定初值为0。,8.2.2 指针变量的运算 1指针变量的赋值 给指针变量赋值,可以使用取地址运算符,把地址值赋给指针变量。也可以把指针变量的值直接赋给另一指针变量,此时两指针变量指向同一对象。还可以给指针变量赋NULL值。,例如: int i,*p1,*p2; p1= 定义了整型变量i和两个指向整型变量的指针变量p1和p2。第一个赋值语句将i的地址赋给p1,即p1指向i,第二个赋值语句

5、将p1的值赋给p2,这样p1和p2均指向i,如图8-2所示。,2指针的移动 当指针变量p指向某一连续存储区中的某个存储单元时,可以通过加减某个常量或自增自减运算来移动指针。 在对指针进行加减运算时,数字1代表一个存储单元的长度,至于一个存储单元占多少字节,要根据指针的基类型而定。在Visual C+ 6.0中,基类型为字符型的指针加1时,移动1个字节;基类型为整型的指针加1,移动4个字节;基类型为float类型的指针加1,则指针移动4个字节。一般地,在对指针进行加减整数n时,其结果不是指针值直接加或减n,而是与指针所指对象的数据类型,即指针基类型有关。指针变量的值(地址)应增加或减小nsize

6、of(指针基类型)字节。,另外,指向某一连续存储区,如一个数组存储区的两个同基类型指针相减,可直接求出两指针间相距的存储单元或数组元素个数,而不用再除以sizeof(指针基类型)。显然,两指针相加没有含义。,3指针的比较 一般情况下,当两个指针指向同一个数组时,可在关系表达式中对两个指针进行比较。指向前面的数组元素的指针变量要小于指向后面的数组元素的指针变量。例如: int *p1,*p2,a10; p1= 则p1的值要小于p2的值,或者说关系表达式p1p2的值为1。 注意:如果p1和p2不指向同一数组则比较无效。,4通过间接访问运算符 * 引用一个存储单元 假设有以下说明和语句: int i

7、=123,*p,k; p=都将把变量i中的值赋给k。 运算符 & 和 * 都是单目运算符,它们具有相同的优先级别,结合方向为从右至左。间接访问运算符 * 的运算对象必须出现在它的右侧,且运算对象只能是指针变量或地址。 当指针变量定义和赋值之后,引用变量的方式可以用变量名直接引用,也可以通过指向变量的指针间接引用。下面看一个例子。 【例8.1】分析程序的执行过程和变量引用方式。,8.3 指针与数组 8.3.1 指针与一维数组 (1)通过一维数组名所代表的地址引用数组元素。 a代表了a0的地址,ai代表了ai的地址,故*(a+i)代表了第i个元素ai。 (2)通过指针变量引用数组元素。 假设变量定

8、义同上,则语句p=a;把a0的地址值赋给指针变量p,而p+i代表了ai的地址,所以*(p+i)代表了ai。,(3)通过带下标的指针引用数组元素。 假设变量定义同上,且p已指向a0,则*(p+i)代表了ai,而*(p+i)可以写成pi,所以pi也代表了数组元素ai。 思考:如果p已指向a2,则pi代表哪个数组元素? 综上所述,在p指向数组a的第一个元素的条件下,对ai数组元素的引用方式还可以是*(a+i)、*(p+i)、pi。,【例8.2】输出整型数组a的全部元素。 【例8.3】编写一个函数inverse,它能够把整型数组a第m个数开始的n个数按逆序重新排列。 (1)数组元素引用形式的变化 通过

9、数组名所代表的数组首地址来引用数组元素。函数inverse()可以改写成: void inverse(int a,int m,int n) int i,j,t; for(i=m-1,j=m+n-2;i=m-1+n/2;i+,j-) t=*(a+i); *(a+i)=*(a+j); *(a+j)=t; , 通过指针变量来引用数组元素。定义两个指向int型变量的指针变量p1和p2,初值设定为a+m-1和a+m+n-2,即分别指向am-1和am+n-2(见图8-4),这样am-1和am+n-2可以分别通过*p1和*p2来引用。以后每循环一次p1加1,即指向后一个元素,p2减1即指向前一个元素。函数i

10、nverse()可以改写成: void inverse(int a,int m,int n) int *p1,*p2,t; for(p1=a+m-1,p2=a+m+n-2;p1=a+m-1+n/2;p1+,p2-) t=*p1; *p1=*p2; *p2=t; ,函数中对指针变量执行了+和-运算,+和-运算符用于指针变量可以使指针变量自动指向后一个或前一个数组元素,但使用时很容易出错,要注意运算规则: ap+指向数组的后一个元素。p-指向数组的前一个元素。 b*p+等价于*(p+),其作用是先得到p指向变量的值(即*p),然后再使p增1。例如,上面inverse()函数中的for语句可改写为:

11、 for(;p1a+m-1+n/2;) t=*p1; *p1+=*p2; *p2-=t; ,c*(p+)与*(+p)的作用不同。前者是先取*p的值,然后使指针变量p加1;后者是先使指针变量p的值加1,再取*p。 d(*p)+表示p所指向的变量值加1。,(2)将形参a定义为指针变量 前面在定义函数inverse()时,将形参a定义为数组名,也可以将形参a定义为指向int型变量的指针变量,即形参说明改为: int *a,int m,int n; 若将实参数组x的首地址传给形参a,则a指向x0,如图8-5所示。这时在函数中可以通过指针变量a来间接访问实参数组x,即*(a+i)代表xi。函数inver

12、se()可以改写成: void inverse(int a,int m,int n) int i,j,t; for(i=m-1,j=m+n-2;i=m-1+n/2;i+,j-) t=*(a+i); *(a+i)=*(a+j); *(a+j)=t; ,由于*(a+i)可以等价地写成ai,所以可以通过带下标的指针来访问实参数组元素。函数inverse()可以改写成: void inverse(int a,int m,int n) int i,j,t; for(i=m-1,j=m+n-2;i=m-1+n/2;i+,j-) t=ai; ai=aj; aj=t; ,综上所述,归纳为以下两点: 函数对数组

13、进行处理时,形参可以用数组名,也可以用指针变量。 数组名作形参时,对应的实参应是实参数组某元素的地址,此时形参数组的首地址即是实参数组该元素的地址,从该地址开始,形参数组和实参数组共同占用一片连续的内存单元。函数执行之前实参数组元素的值即作为形参数组元素的值。反过来,若在函数执行过程中形参数组元素的值发生改变,也会引起相应实参数组元素值的改变。,指针变量作形参时,对应的实参是实参数组某元素的地址,此时形参指针变量指向实参数组的该元素,改变形参指针变量的值可以指向实参数组的其他元素。在函数中可以通过指针变量间接访问实参数组元素,从而也可以改变实参数组元素的值。,数组元素的引用形式变化多样。当函数

14、形参是数组名时,对形参数组元素的引用有3种形式:通过下标引用、通过形参数组名引用、通过指针变量引用。当函数形参是指针变量时,对实参数组元素的引用形式有两种:通过形参指针变量引用、通过带下标的形参指针变量引用。,【例8.4】在数组table中查找x,若数组中存在x,程序输出数组中第一个x对应的数组下标,否则输出-1。 注意: (1)函数lookup()中的for循环也可以写成: for(k=0;kn;k+) if (tk=val) *i=k; return; 即用tk这样的形式引用数组元素。,(2)函数lookup()的形参t也可以定义为数组名,即对形参的说明改为: int t,int *i,i

15、nt val,int n,8.3.2 指针与二维数组 1二维数组元素的地址 在C语言中,一个二维数组可以看成是一个一维数组,其中每个元素又是一个包含若干个元素的一维数组。设一个二维数组的定义为: int a23; 则C编译系统认为a数组是一个由a0和a1两个元素组成的一维数组,而a0和a1又分别代表一个一维数组。a0中包含a00、a01、a02三个元素,a1中包含a10、a11、a12三个元素,如图8-6所示。,图8-6 二维数组的结构,注意:a+1和a0+1中的1,其含义是不一样的。当把二维数组a看作一维数组时,它有a0和a1两个元素,每个元素又是含有3个int型元素的一维数组,所以a+1中的1代表3个int型数据所占的字节数,a每增加1相当于指针移动一行。a0可以看作是含有a00、a01、a02共3个元素的一维数组,每个元素是int型数据,所以a0+1中的1代表1个int型数据所占的字节数,a0每次增加1相当于指针移动一个列元素。,2通过地址值引用二维数组元素 假设二维数组a的定义同上,通过上面对二维数组元素地址的分析,得到数组a中任一元素aij的地址表示为: &aij=ai+j 所以对aij的引用可以写成: *(ai+

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

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

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