c语言程序设计能力教程教学课件作者李小遐第8章

上传人:E**** 文档编号:102541853 上传时间:2019-10-03 格式:PPT 页数:58 大小:619KB
返回 下载 相关 举报
c语言程序设计能力教程教学课件作者李小遐第8章_第1页
第1页 / 共58页
c语言程序设计能力教程教学课件作者李小遐第8章_第2页
第2页 / 共58页
c语言程序设计能力教程教学课件作者李小遐第8章_第3页
第3页 / 共58页
c语言程序设计能力教程教学课件作者李小遐第8章_第4页
第4页 / 共58页
c语言程序设计能力教程教学课件作者李小遐第8章_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《c语言程序设计能力教程教学课件作者李小遐第8章》由会员分享,可在线阅读,更多相关《c语言程序设计能力教程教学课件作者李小遐第8章(58页珍藏版)》请在金锄头文库上搜索。

1、C语言程序设计,软件教研室,第8章 指针及其应用,学习目标 掌握指针的概念及基本操作,指针在数组和函数中的应用。 学习内容 指针、指针变量的概念、 指针变量定义及使用 指针与一维数组 指针与二维数组 指针与字符串 指针与函数,8.1 指针的基本用法,8.1.1 指针的概念,计算机的内存是以字节为单位的一片连续的存储空间,每个字节都有一个编号,这个编号称为内存单元地址。,若在程序中定义了一个变量,系统就会根据变量的类型为变量在内存中分配若干字节的存储空间,此后这个变量的单元地址也就确定了。,有了变量的地址,就可以立即找到该变量所在的存储单元并进行数据的存取操作。程序中常是通过变量名对变量进行访问

2、,因为变量名是变量的符号地址,它与单元物理地址之间的联系由系统自动建立。,存储单元地址惟一地对应着(或指向)存储单元,因此C语言将存储单元地址形象地称为“指针”。 专门用来存放另一个变量的地址(即指针)的变量,称为指针变量。,如果p是指针变量,而且p中存放着变量a的地址,则称p指向a ,如图示:,8.1.2 指针变量的定义和使用,指针变量的定义,一般定义形式为:,例如:int *p1,*p2;,基类型名 *指针变量名;,说明: (1)定义了两个指针变量,变量名为p1和p2,这两个变量只能用来存放地址。 (2)*是一个说明符用来说明定义的是指针变量,定义指针变量时必须有。 (3)基类型表示指针变

3、量所指向的变量的类型,也就是说,p1、p2中只能存放整型变量的地址。,指针变量的使用,(1)运算符“&”和“*”,运算符“&”为取地址运算符,后跟一个变量 运算符“*”为间接访问运算符,后跟一个指针变量,(2)指针变量的赋值,通过给指针变量赋地址值,可以让指针变量指向某个变量。 例如有以下定义和语句: int a,b,*pa,*pb; pa= /*指针变量pb指向变量b*/,下面的定义和语句是错误的: float x; int *p; p= 错误原因是x的类型和p的基类型不一致。,(3)通过指针变量引用变量 例如,有以下定义和语句: int i,j,*p; p=,*p=10; /*将10赋给p

4、所指向的变量即变量i,等价于赋值语句i=10;*/ j=*p+1; /*取指针变量p所指向的存储单元中的值加1后赋给变量j,j的值为11*/ *p=*p+1; /*取指针变量p所指向的存储单元中的值,加1后再放入p所指向的存储单元中,也就是使变量i的值增1变为11*/,小测验 int a=11,b=22,*pa,*pb; pa=有什么不同?,【例8-1】通过指针变量访问整型变量。 【程序代码】,#include void main( ) int i,j,*pi; /*定义整型变量i和j,指针变量pi*/ i=10; pi= ,程序运行结果:,【例8-2】从键盘上输入任意三个实数,利用指针的方法

5、将这三个实数按大小进行排序。,(1)输入3个实数分别放到变量a、b、c中。 (2)3个指针变量p1、p2、p3分别指向变量a、b、c。 (3)比较变量的值,最终使p1指向最大值,p3指向最小值。 (4)按顺序输出p1、p2、p3所指向的变量的值。,【编程思路】,#include void main( ) float a,b,c,*p1,*p2,*p3,*p; printf(“请输入3个实数:“); scanf(“%f,%f,%f“, ,【程序代码】,程序运行结果:,该程序执行过程中,变量a、b、c的值始终未变,只是使指针p1最终指向值最大的变量,使指针p3最终指向值最小的变量。,8.2 指针与

6、数组,8.2.1 指针与一维数组,指针的移动,当指针变量指向一串连续的存储单元(即数组)时,可以对指针变量加上或减去一个整数来进行指针的移动和定位。 例如有如下语句:,int a5=10,20,30,40,50,*p,*q; p=,指针p的指向情况如图所示。在此基础上,随着下面各个语句的执行 ,指针p和q的指向会发生相应变化。,q=p+1; 如图 (a)所示,使指针变量q指向数组元素a1 q+; 指针后移,指针变量q指向数组元素a2 q+=2; 指针变量q指向数组元素a4 q-; 指针变量q指向数组元素a3 p+; 指针变量p和q的指向如图 (b) 所示,现在如果有语句 i=*p;j=*q;

7、则i中的值为20,j中的值为40。,数组元素的地址,C程序中,数组名是数组的首地址,即第1个数组元素的地址,该地址是地址常量,不能被修改或重新赋值 ,但可以通过数组名来表示数组元素的地址 。,例如:int a10,*p;p=a; 此时指针p指向数组a的第1个元素,如图示:,那么,数组元素地址的几种表示形式见下表。,提示:对指针变量p更多的是通过p+或p-移动定位。,数组元素的引用,针对数组元素地址的不同表示形式,数组元素的引用形式也有多种,见下表:,下面语句通过数组名逐个输出数组a中各元素的值: for(i=0;i10;i+) printf(“%5d“,*(a+i);,下面语句通过移动指针来逐

8、个输出数组a中各元素的值: for(p=a;pa+10;p+) printf(“%5d“,*p);,【例8-3】有一个数组score ,存放10个学生的成绩,求平均成绩,要求通过指针变量来访问数组元素。,【程序代码】,#include void main( ) float score10,*p,sum=0,ave; printf(“请输入10个学生成绩:“); for(p=score;pscore+10;p+) scanf(“%f“,p); for(p=score;pscore+10;p+) sum+=*p; /*取各成绩累加到sum 中*/ ave=sum/10; /*求平均成绩*/ pri

9、ntf(“平均成绩%.2fn“,ave); ,程序运行结果:,【例8-4】使数组中的元素逆序存放(不借助其它数组),要求用指针的方法处理。,(1)定义两个指针变量p1、p2,使p1指向第一个元素、p2指向最后一个元素。 (2)将p1、p2所指向的数组元素的值互换,然后使p1指向第二个元素、p2指向倒数第二个元素,再做上面的互换操作,这样重复下去,直到p1指向了p2的后面或p1和p2指向了同一元素为止。,【编程思路】,【程序代码】,#include void main( ) int a10,*p1,*p2,temp; printf(“请输入10个数:“); for(p1=a;p1a+10;p1+

10、) scanf(“%d“,p1); for(p1=a,p2=a+9;p1p2;p1+,p2-) temp=*p1; *p1=*p2;*p2=temp; printf(“逆序后数组的值: “); for(p1=a;p1a+10;p1+) printf(“%5d“,*p1); printf(“n“); ,程序运行结果为:,8.2.2 指针与二维数组,二维数组元素的地址,与一维数组名一样,二维数组名a也是数组的首地址。 二维数组名的基类型不是数组元素类型,而是一维数组类型。 例如:int a33; 二维数组名a是一个行指针,其指向如图所示。,二维数组a包含三个行元素:a0、a1和a2,而它们又都是一

11、维数组名,因此也是地址常量,但是它们的基类型与数组元素类型一致。 第0行首地址:a0 第1行首地址:a1 第2行首地址:a2 a0+1就是数组元素a01的地址,a1+1是数组元素a11的地址,那么任意的数组元素aij的地址是ai+j。,二维数组元素的地址表示形式较多,每种地址形式都有对应的数组元素引用方法。比如: 数组元素地址: &aij ai+j *(a+i)+j 数组元素引用: aij *(ai+j) *(*(a+i)+j),指向二维数组元素的指针变量(列指针),【例8-5】用指向数组元素的指针访问数组。,可以通过对指向数组元素的指针变量进行加减运算来达到引用任意数组元素的目的,引用方法与

12、引用一维数组元素一样。,#include void main( ) int a33=1,2,3,4,5,6,7,8,9; int *p; for(p=a0;pa0+9;p+) /*最后一个元素的地址是a0+8*/ if(p-a0)%3=0) printf(“n“); /*换行控制*/ printf(“%5d“,*p); printf(“n“); ,指向二维数组的行指针变量(行指针),行指针变量就是用来存放“行”地址的变量,一般定义形式为: 数据类型名 (*指针变量名)数组长度; 例如:int (*p)4;,p是一个指针变量,它的基类型是一个包含4个整型元素的一维数组,因此指针变量p可以指向一个

13、有4个元素的一维数组。,【例8-6】利用行指针输出二维数组元素的值。 【程序代码】,#include void main( ) int a33=1,2,3,4,5,6,7,8,9; int (*p)3,j; /*指针变量p为行指针*/ for(p=a;pa+3;p+) for(j=0;j3;j+) printf(“%5d“,*(*p+j); printf(“n“); ,程序运行结果为:,指针数组,有如下定义: int a34, *p3;,数组p是一个包含3个元素的一维数组。 它的每个元素都是基类型为int的指针。 称数组p为指针数组。 pi和ai(0i3)的基类型相同(都为int类型) 赋值语

14、句pi=ai; 是合法的。,有以下循环语句: for(i=0;i3;i+) pi=ai; 语句执行完后,数组p的3个元素p0、p1和p2分别指向数组a每行的开头。,小测验: 此时如果有语句printf(“%d,%d”,*p0,*(p0+1); 那么输出的是哪些数组元素的值?,8.2.3指针与字符串,【例8-7】通过指针引用字符串。,【程序代码】,#include void main( ) char str =“BeiJing“,*p; p=str; /*指针p指针字符串首部*/ printf(“%sn“,p); /*从字符串首字符开始输出,遇0结束*/ p+=3; /*移动指针p*/ prin

15、tf(“%sn“,p); /*从指针p所指字符开始输出,遇0结束*/ ,程序运行结果为:,【例8-8】利用指针实现两个字符串的连接。,【编程思路】,(1)指针p指向第一个串的末尾(最后一个字符后面),指针q指向第二个串的首部。 (2)将第二个串中字符依次放入第一个串后。,【程序代码】,#include #include void main( ) char str120,str210,*p,*q; printf(“请输入两个字符串:“); gets(str1); gets(str2);,p=str1+strlen(str1); /*p指向第一个串的末尾*/ q=str2; /*q指向第二个串的首部*/ while(*q!=0) /*如果第二个串未结束,继续执行*/ *p=*q; p+; /*指针p向后移动*/ q+; /*指针q 向后移动*/ *p=0; /*串末尾加上结束标志*/ printf(“连接后新串为:“); puts(str1); ,程序运行结果为:,8.3 指针与函数,8.3.1 变量地址作函数参数,调用函数时,通过函数的参数不仅能够传递普通的值,而且还能传递地址值。 当实参为

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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

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