ImageVerifierCode 换一换
格式:PPT , 页数:140 ,大小:379KB ,
文档编号:7904165      下载积分:15 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-7904165.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(momomo)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(《新编C语言程序设计教程》课件第10章.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

《新编C语言程序设计教程》课件第10章.ppt

1、第10章 指针类型第第1010章章 指针类型指针类型10.1 指针与指针变量指针与指针变量 10.2 指针与数组指针与数组 10.3 指针与字符串指针与字符串 10.4 指针与结构体指针与结构体 10.5 指针与链表指针与链表 10.6 指针与函数指针与函数 10.7 指针作基类型指针作基类型 10.8 程序设计举例程序设计举例 第10章 指针类型10.1 指针与指针变量指针与指针变量 10.1.1 指针变量的定义指针变量的定义 1.定义方法定义方法 形式:类型标识符 *变量标识符;定义存放指定类型数据地址的指针变量。第10章 指针类型例如:(1)int *p1,*p2,*p3;定义指向整型数

2、据的指针变量p1、p2、p3。(2)float *q1,*q2,*q3;定义指向实型数据的指针变量q1、q2、q3。(3)char *r1,*r2,*r3;定义指向字符型数据的指针变量r1、r2、r3。第10章 指针类型 (4)struct date int year;int month;int day;*t1,*t2,*t3;定义指向struct date类型数据的指针变量t1、t2、t3。第10章 指针类型 说明:(1)指针变量可与普通变量混合定义,指针变量的定义与普通变量的定义用变量名前加“*”区分。例如:int i,*p;/*定义整型变量i,指针变量p*/(2)空指针“NULL”是一特

3、殊的指针数据,表示空地址,相当于整型数据中的0,字符数据中的空格。第10章 指针类型 (3)指针变量只能用于存放指定类型数据的地址。如以上定义的一些指针变量,p1、p2、p3只能存放整型数据的地址,q1、q2、q3只能存放实型数据的地址,r1、r2、r3只能存放字符型数据的地址,t1、t2、t3只能存放struct date型数据的地址。第10章 指针类型 (4)指针变量不能直接赋以具体地址值,不能从键盘输入值。指针变量通过间接赋以相关数据的地址,或调用存储空间分配函数得到值。例如:int i,j,k;int*p1=&i,*p2=&j,*p3=&k;/*p1得到i的地址,p2得到j的地址,p3

4、得到k的地址*/第10章 指针类型 (5)指针类型隐含在指针变量的定义中。例如,在上面定义指针变量p1、p2、p3时,实际上在背后隐含定义了一指向整型数据的指针类型,从形式上可以将int*看成是指向整型数据的指针类型。与数组定义一样,通过typedef可以将指针类型与指针变量分离。例如,上面定义的指针变量p1、p2、p3,可以改用如下形式:typedef int *INTPOINT;INTPOINT p1,p2,p3;第10章 指针类型 (6)指针变量本身占有2字节的存储空间。(7)“void*”指针类型定义的指针变量,不指向哪一种特定类型的数据,在实际使用时通过强制类型转换成指向特定类型的数

5、据。第10章 指针类型2.指针变量所指向的变量特定类型的数据指针变量所指向的变量特定类型的数据 例如,对指针变量p1、p2、p3,假定已有值,*p1、*p2、*p3代表指针变量p1、p2、p3所指向的数据,也就是p1、p2、p3的值对应的存储单元里存放的数据,称为指针变量所指向的变量,简称指针指向变量。如果指针变量p1、p2、p3分别存放整型变量i、j、k的地址,则p1指向i,p2指向j,p3指向k。图10-1来直观反应指针变量与指针指向变量的关系。第10章 指针类型图 10-1 p1*p1&iip2*p2&jjp3*p3&kk第10章 指针类型指针指向变量*p1、*p2、*p3相当于整型变量

6、i、j、k。例如:int *p=&i;scanf(“%d”,p);/*等价于scanf(“%d”,&i)*/printf(“%d”,*p);/*等价于printf(“%d”,i)*/第10章 指针类型10.1.2 指针的运算指针的运算 1.引用运算引用运算 1)取地址运算(&)取地址运算“&”,对指针变量进行取地址运算,可以得到指针变量本身的地址。第10章 指针类型 2)取内容运算(*)取内容运算“*”,前称指针运算,用于获取地址数据对应存储单元的内容。取内容运算的优先级与取地址运算优先级相同,也为第2级,结合性亦为右结合。对指针变量,进行取内容运算可以得到指针变量所指向的数据。取内容运算与取

7、地址运算实质上是一对互逆运算。例如:int a,*p=&a;*(&a)就是a,&(*p)就是p;p指向a,*p与a等价。第10章 指针类型 2算术运算 指针变量可以进行有限的算术运算。1)加减运算 指针变量“加上”或“减去”一个整数n,相当于指针变量加上或减去n个指针所指向数据的存储单位,即指针由当前指向位置向后或向前移动n个指针所指向数据的存储单位。加减运算常用于数组的处理。对指向一般数据的指针,加减运算无实际意义。例如:int a10,*p=a,*x;x=p+3;/*实际上是p加上3*2个字节赋给x,x指向数组的第三个分量*/第10章 指针类型 对于不同基类型的指针,指针变量“加上”或“减

8、去”一个整数n所移动的字节数是不同的。例如:float a10,*p=a,*x;x=p+3;/*实际上是p加上3*4个字节赋给x,x依然指向数组的第三个分量*/第10章 指针类型 2)自增自减运算 指针变量自增、自减运算具有上述运算的特点,但有前置后置、先用后用的考虑,务请小心。例如:int a10,*p=a,*x;x=p+;/*x指向数组的第一个分量,p指向数组的第二个分量*/x=+p;/*x、p均指向数组的第二个分量*/*p+相当于*(p+)。*(p+)与(*p)+含义不同,前者表示地址自增,后者表示当前所指向的数据自增。第10章 指针类型 3)指针相减 指针相减得到两指针之间数据的个数,

9、一般用于数组处理。第10章 指针类型 3.关系运算关系运算 两指针的关系运算表示两指针的先后位置关系,一般用于数组处理。除空指针外,不能进行指针与一般数值的关系运算。第10章 指针类型10.1.3 利用指针处理简单数据利用指针处理简单数据 通过指向简单数据的指针变量来处理数据的步骤是:(1)定义以相应简单数据类型为基类型的指针变量。即定义指向简单数据的指针变量。(2)在指针变量与要处理的数据之间建立关联。只需将相应数据的地址赋给指针变量。(3)使用指针所指向的变量来完成数据处理。第10章 指针类型例如,要利用指针处理float数据x:(1)float *p;(2)p=&x;(3)*p即x第10

10、章 指针类型例例 10-1 利用指针,求两个整数的和。/*程序10-1,利用指针,求两个整数的和*/main()int i,j;int *p,*q;/*定义指针变量*/int sum;p=&i;q=&j;/*建立关联*/scanf(%d,%d,p,q);sum=*p+*q;/*使用*/printf(%d,%dn,*p,*q);printf(和=%dn,sum);第10章 指针类型例例 10 2 指针运算示例。/*程序10-2,指针运算*/main()char c=a;char *p=&c;int a1,a2;int *p1,*p2;a1=100;p1=&a1;a2=(*p1)/3+7;p2=&

11、a2;printf(a1=%d,a2=%d,*p1=%d,*p2=%dn,a1,a2,*p1,*p2);a1=(*p1)+;a2=*p2+;第10章 指针类型 printf(a1=%d,a2=%d,*p1=%d,*p2=%dn,a1,a2,*p1,*p2);printf(%c,%cn,c,*p);运行结果:a1=100,a2=40,*p1=100,*p2=40 a1=101,a2=40,*p1=101,*p2=随机值(p2指向a2后一个数据单元)a,a 第10章 指针类型10.1.4 指针作函数参数指针作函数参数 例例 10 3 将两个整数按从小到大的顺序输出。先定义一个函数,用指针变量作参数

12、,实现两个数的交换,然后在主函数中调用它,完成两个整数从小到大的顺序输出。/*程序10-3,将两个整数顺序输出*/void exchang(p1,p2)/*交换两个数*/int *p1,*p2;int p;p=*p1;*p1=*p2;*p2=p;/*结果通过*p1、*p2带回*/第10章 指针类型main()int a,b;int *r,*s;scanf(%d,%d,&a,&b);r=&a;s=&b;if(ab)exchang(r,s);printf(%d,%dn,a,b);输入数据:9,4运行结果:4,9 第10章 指针类型 说明:(1)若在函数中交换指针变量的值,则实参r、s并不改变,指针

13、参数亦是传值。例如:int *p;p=p1;p1=p2;p2=p;不要希望如此能完成处理。第10章 指针类型(2)函数中交换值时不能使用无值的指针变量作临时变量。例如:int *p;*p=*p1;*p1=*p2;*p2=*p;p无值,*p无意义,问题由此产生。第10章 指针类型10.2 指针与数组指针与数组 10.2.1 指向一维数组的指针变量指向一维数组的指针变量 可以利用指向一维数组的指针变量,完成数组数据的操作处理,具体步骤如下:(1)定义与数组相同基类型的指针变量。即定义指向数组的指针变量。(2)在指针变量与要处理的数组(元素)之间建立关联。只需将相应数组的首地址赋给指针变量。(3)使

14、用指针所指向的变量来完成数组元素(数组)的操作处理。第10章 指针类型例如,要利用指针处理整型数组a:(1)定义指针变量:int *p;。(2)建立关联:p=a;或p=&a0;。p+i是下标为i的数组分量的地址。(3)使用:*p即a0,*(p+i)即ai。*p+是p当前指向的数组分量的下一个分量。如此得到处理数组的指针法。第10章 指针类型 与指针法相类似的是处理数组的位移法,或称首地址法。通过数组的首地址计算出下标为i的数组的元素地址(a+i),*(a+i)即ai。指针法中p是变量,用来存放数组元素的地址。位移法中a是常量,代表数组的首地址。第10章 指针类型 例例 10-4 分别用下标法、

15、指针法、位移法输入、输出数组元素。方法一:方法一:/*程序10 4 1,下标法实现数组的输入、输出*/main()int a10;int i;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(i=0;i10;i+)printf(%3d,ai);第10章 指针类型方法二:方法二:/*程序10 4 2,指针法实现数组的输入、输出*/main()int a10;int i,*p;/*定义指针变量*/p=a;/*建立关联*/for(i=0;i10;i+)scanf(%d,p+);printf(n);for(p=a;pa+10;p+)/*使用*/printf(%3d,

16、*p);第10章 指针类型方法三:/*程序10 4 3,位移法实现数组的输入、输出*/main()int a10;int i,;for(i=0;i10;i+)scanf(%d,&ai);printf(n);for(i=0;i10;i+)printf(%3d,*(a+i);第10章 指针类型10.2.2 数组作函数参数数组作函数参数 例例 10 5 求n个整数的最大值、最小值。求n个数的最大值的一般方法我们已非常熟悉,在这里主要考察引入指针处理数组后,数组作函数参数的应用。假定不超过100个数,数据输入输出在主函数中完成,求最大值、最小值用一个函数完成,n个数用参数传递,最大值、最小值使用全局变

17、量。第10章 指针类型方法一:形参用指针,实参用数组名。程序如下:/*程序10 5 1,求n个整数的最大值、最小值*/define L 100int max,min;main()int aL;int n,i;void max-min();printf();scanf(%d,&n);printf(请输入%d个数:,n);第10章 指针类型 for(i=0;in;i+)scanf(%d,&ai);max-min(a,n);/*调用函数*/printf(最大值=%4d,最小值=%4dn,max,min);void max-min(p,x)/*求最大值、最小值函数*/int *p,x;int i;ma

18、x=min=*p;/*最大值、最小值初始化为第一个数据*/for(i=1;imax)max=*(p+i);if(*(p+i)min)min=*(p+i);第10章 指针类型运行结果:请输入数的个数n:6请输入6个数:32 54 7 88 13 49最大值=88,最小值=7 第10章 指针类型方法二:方法二:形参用数组,实参用指针。程序如下:/*程序10 5 2,求n个整数的最大值、最小值*/define L 100int max,min;main()int aL,*p;int n,i;void max-min();printf(请输入数的个数n:);scanf(%d,&n);printf(请输

19、入%d个数:,n);for(i=0;in;i+)scanf(%d,&ai);第10章 指针类型 p=a;max-min(p,n);/*调用函数*/printf(最大值=%4d,最小值=%4dn,max,min);void max-min(b,x)/*求最大值、最小值函数*/int b,x;int i;max=min=b0;/*最大值、最小值初始化为第一个数据*/for(i=1;imax)max=bi;if(bimin)min=bi;第10章 指针类型方法三:形参用指针,实参用指针。程序如下:/*程序10 5 3,求n个整数的最大值、最小值*/define L 100int max,min;ma

20、in()int aL,*p;int n,i;void max-min();printf(请输入数的个数n:);scanf(%d,&n);printf(请输入%d个数:,n);for(i=0;in;i+)scanf(%d,&ai);第10章 指针类型 p=a;max-min(p,n);/*调用函数*/printf(最大值=%4d,最小值=%4dn,max,min);void max-min(q,x)/*求最大值、最小值函数*/int *q,x;int i;max=min=*q;/*最大值、最小值初始化为第一个数据*/for(i=1;imax)max=*(q+i);if(*(q+i)min)min

21、=*(q+i);第10章 指针类型10.2.3 指向二维数组的指针变量指向二维数组的指针变量 1.二维数组的指针二维数组的指针 对于二维数组,相当于一张二维表格,存储按行按列存放。二维数组具有首地址、行地址、元素地址等相关指针。数组名代表首地址,称为二维数组的指针;行地址是二维数组中一行的首地址,二维数组中一行相当于一个一维数组;元素地址是二维数组的具体分量地址。第10章 指针类型例如,对二维整型数组a45,相当于下面的二维数据表:第0列 第1列 第2列 第3列 第4列 第0行:a00,a01,a02,a03,a04,相当于一维数组a0第1行:a10,a11,a12,a13,a14,相当于一维

22、数组a1第2行:a20,a21,a22,a23,a24,相当于一维数组a2 第3行:a30,a31,a32,a33,a34,相当于一维数组a3 第10章 指针类型 (1)a代表整个二维数组的首地址,也就是第 0 行的首地址。也可用a0、&a00表示。(2)ai代表第i行的首地址。整个二维数组也相当于一个一维数组a0、a1、a2、a3,基于一维数组的处理方法,第i行的首地址还可用*(a+i)、a+i、&ai、&ai0表示。请注意*a表示 0 行首地址,而非a00。第10章 指针类型 (3)ai+j代表aij的地址。aij的地址还可用*(a+i)+j表示。请注意aij的地址不能用(a+i)+j表示

23、,因为此时实际表示的是第(i+j)行的地址。aij相对a00的绝对地址可用a0+i*5+j计算。如果每行有m个元素,aij相对a00的绝对地址可用a0+i*m+j计算。当然&aij是我们早就知道的aij的地址。第10章 指针类型 (4)基于上面的分析,引入指针后,二维数组的分量aij可表示成:aij*(ai+j)*(*(a+i)+j)*(a0+i*m+j)相应得到处理二维数组的多种形式位移法。第10章 指针类型例10-6 输出一个指定的二维数组。程序如下:/*程序10-6,输出一个指定的数组*/main()static int a45=1,2,3,4,5,6,7,8,9,10,11,12,13

24、,14,15,16,17,18,19,20;int i,j;for(i=0;i4;i+)for(j=0;i5;j+)printf(%6d,*(a0+i*5+j);printf(n);第10章 指针类型运行结果:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 输出语句也可以是:printf(%6d,*(*(a+i)+j);第10章 指针类型2.指向二维数组元素的指针变量指向二维数组元素的指针变量 利用指向二维数组元素的指针变量,可以完成二维数组数据的操作处理,这也就是处理二维数组的指针法。(1)定义与数组相同基类型的指针变量。(2)在指针变量

25、与要处理的数组(元素)之间建立关联。(3)使用指针所指向的变量来完成数组元素(数组)的操作处理。第10章 指针类型例例 10 7 输出同例10 6指定数组。/*程序10 7,输出指定数组*/main()static int a45=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20;int *p;for(p=a0;p”来得到结构体的成员。“”运算符由“”和“”复合组成,运算优先级与“.”运算相同。例如,pname、page即someone.name、someone.age。至此,我们有以下三种形式来引用结构体成员:结构体变量.成员名 (*结构体

26、指针).成员名 结构体指针成员名 第10章 指针类型例例 10 14 对上例,考虑三个人组成的结构体数组的处理。程序如下:/*程序10 14,结构体数组的指针处理*/struct personchar *name;int age;struct person sp3=张三,18,李四,19,王五,20;main()第10章 指针类型struct person *p;printf(姓名 年龄n);for(p=sp,p name,p-age);运行结果:姓名 年龄 张三 18 李四 19 王五 20 第10章 指针类型10.4.2 指向结构体的指针作函数参数指向结构体的指针作函数参数 例例 10 1

27、5 有40个学生,每个学生包括学号、姓名及成绩,用函数输出成绩最高的学生数据。/*程序10 15指向结构体的指针作函数参数例*/struct studentint num;char *name;float score;void print(p)/*输出函数*/struct student *p;/*结构体指针作函数参数*/第10章 指针类型 printf(%d%s%f n,p num,p name,p score);int maxi(p)/*求最高分学生序号的函数*/struct student *p;int i,t;t=0;for(i=1;i*(p+t).score)t=i;return(t

28、);第10章 指针类型main()struct student stu40;int i,k;for(i=0;idata);/*得到数据,放结点数据域*/while(pdata0)pnext=head;/*建立链接,当前结点指针域存放下一结点地址*/head=p;/*用头指针保存当前结点*/*为下一个结点申请空间*/p=(struct linklist*)malloc(sizeof(struct linklist);scanf(%d,&pdata);/*得到新结点数据*/第10章 指针类型2.尾插法尾插法 若将链表的左端固定,链表不断向右延伸,这种建立链表的方法称为尾插法。尾插法建立链表时,头指

29、针固定不动,故必须设立一个搜索指针,向链表右边延伸,则整个算法中应设立三个链表指针,即头指针head、搜索指针p2、申请单元指针p1。尾插法最先得到的是头结点。例10-17 用尾插法建立一些正整数链表。/*程序10 17,用尾插法建立一些正整数链表*/main()struct linklist int data;struct linklist *next;第10章 指针类型struct linklist *head,*p1,*p2;head=NULL;/*空链表*/p1=(struct linklist*)malloc(sizeof(struct linklist);/*申请空间*/scanf

30、(%d,&p1-data);/*得到数据*/while(p1-data0)if(head=NULL)head=p1;else p2-next=p1;/*建立连接*/p2=p1;/*保存当前结点*/*为下一个结点申请空间*/p1=(struct linklist*)malloc(sizeof(struct linklist);scanf(%d,&p1data);/*得到下一个结点数据*/p2next=NULL;/*最后的尾结点指针域为空指针*/第10章 指针类型10.5.3 单链表的基本操作单链表的基本操作 注意两点:(1)将链表传递进函数,只需将链表头指针传递进函数。函数的形参对应实参头指针。

31、(2)对链表的访问用条件循环控制,循环的条件是结点的指针域非空。第10章 指针类型1.输出链表中所有结点输出链表中所有结点void print(struct linklist*head)/*输出链表所有结点*/struct linklist *p;p=head;/*p指向链表第一个结点*/while(p!=NULL)printf(%d,p-data);p=p-next;/*p指向下一个结点*/第10章 指针类型2.统计链表中结点个数统计链表中结点个数只需将上述输出结点改成计数即可。int count(struct linklist *head)/*统计链表中结点个数*/int n=0;stru

32、ct linklist *p;p=head;while(p!=NULL)n+;p=p-next;return(n);第10章 指针类型3.插入操作插入操作 void ins(struct linklist*head,int i,int x)/*插入结点*/int j;struct linklist*p,*q;p=head;j=1;while(p!=NULL)&(jnext;j+;q=(struct linklist*)malloc(sizeof(struct linklist);/*产生插入结点*/q-data=x;q-next=p-next;/*q插入p之后*/p-next=q;第10章 指

33、针类型4.删除操作删除操作 假设删除链表中第i个结点,先找到第i-1个结点和第i个结点,然后将第i+1个结点链接在第i-1个结点后,再释放第i个结点所占空间,完成删除操作。第10章 指针类型void del(struct linklist*head,int i)/*删除结点*/int j;struct linklist*p,*q;p=head;j=1;while(p!=NULL)&(jnext;j+;if(p=NULL)printf(找不到结点!);else q-next=p-next;/*删除第i个结点*/free(p);第10章 指针类型 双链表有两个指针域,一个指针指向左边结点,一个指针

34、指向右边结点,用头指针表示开始结点,用尾指针表示结尾结点。例如:最简单的双链表可用如下递归结构体描述:struct linklist int data;struct linklist *llink,*rlink;struct linklist *head,*rear;第10章 指针类型10.6 指针与函数指针与函数 10.6.1 指向函数的指针变量指向函数的指针变量 1.定义指向函数的指针变量定义指向函数的指针变量 形式如下:类型标识符 (*变量标识符)();类型标识符是指针变量所指向的函数类型,变量标识符是指向函数的指针变量名。例如:int(*p)();第10章 指针类型 说明:(1)定义指

35、向函数的指针变量,可以指向一类函数。(2)定义指向函数的指针变量时,括号不能省略。例如,int*p()定义的是指针函数头,返回值是指向整型数据的指针值,而不是指向函数的指针变量。(3)对指向函数的指针变量p,p+i、p+、p-等运算无意义。第10章 指针类型 2.让指针变量指向函数让指针变量指向函数 定义了指向函数的指针变量,就可以在指针变量与特定函数之间建立关联,让指针变量指向特定函数。建立关联的方法为:指针变量=函数名;说明:(1)指针变量只能指向定义时所指定的一类函数。(2)一个指针变量可以先后指向多个不同的函数。第10章 指针类型 3.利用指针实现函数调用利用指针实现函数调用 指针变量

36、一旦指向某函数,利用指针所指向的变量可以实现函数调用。调用形式:(*指针变量)(实参表);第10章 指针类型例例 10 18 通过指针调用函数。/*程序10 18,通过指针调用函数,求两个数的最大值*/float max(x,y)/*求两个数的最大值*/float x,y;float z;z=(x=y)?x:y;return(z);main()float (*p)();/*定义指向一类实型函数的指针变量*/float a,b;float m;scanf(%d,%d,&a,&b);p=max;/*建立关联*/m=(*p)(a,b);/*利用指针实现函数调用*/printf(a=%d,b=%d,m

37、ax=%dn,a,b,m);第10章 指针类型10.6.2 指向函数的指针变量作函数参数指向函数的指针变量作函数参数 例例 10 19 编制程序,调用一个多功能函数,对于最大值函数参数,求两个数的最大值;对于最小值函数参数,求两个数的最小值。程序如下:/*程序10-19,指向函数的指针变量作函数参数例*/main()int maxf(),minf(),fun();int a,b;int max,min;scanf(%d,%d,&a,&b);max=fun(a,b,maxf);/*多功能函数求最大值*/min=fun(a,b,minf);/*多功能函数求最小值*/printf(最大值=%d,ma

38、x);printf(最小值=%d,min);第10章 指针类型int maxf(x,y)/*最大值函数*/int x,y;if(xy)return(x);else return(y);int minf(x,y)/*最小值函数*/int x,y;if(xy)return(x);else return(y);int fun(x,y,p)/*多功能函数*/int x,y;int (*p)();/*p参数为指向整型函数的指针变量*/int result;result=(*p)(x,y);/*通过指针调用函数*/return(result);第10章 指针类型 输入数据:28,32 运行结果:最大值=3

39、2 最小值=28 第一次调用fun()函数时,除了将a、b的值传递给x、y外,还将函数maxf()的入口地址(maxf)传递给指向函数的指针变量p,这时函数fun()中的(*p)(x,y)相当于maxf(x,y)。第二次调用fun()函数时,a、b的值同样传递给x、y,另将函数minf()的入口地址(minf)传递给指向函数的指针变量p,这时函数fun()中的(*p)(x,y)相当于minf(x,y)。第10章 指针类型10.6.3 指针函数指针函数 例例 10 20 设有若干学生,每个学生有6门课程成绩。输入学生序号,输出其全部成绩,用指针函数实现。程序如下:/*程序10-20,指针函数示例

40、*/float *pointf(p,n)/*计算第n个学生的成绩数据地址的指针函数*/float (*p)6;/*指向一个学生整个成绩的指针变量*/int n;float *t;t=*(p+n);return(t);main()第10章 指针类型 static float score6=70,85,78,80,90,99,90,79,63,70,56,68,49,60,56,50,70,60,60,60,56,50,70,60,65,68,56,50,80,60;int m;/*学生序号*/float *k;/*学生数据地址*/int i;printf(“请输入学生序号:”);scanf(%d

41、,&m);k=pointf(score,m);/*调用函数计算序号m的学生成绩地址*/printf(序号为%d的学生成绩如下:n,m);for(i=0;i5;i+)printf(%6.2ft,*(k+i);第10章 指针类型10.7 指针作基类型指针作基类型 10.7.1 指针数组指针数组 若数组每个元素的类型为指针类型,则称此数组为指针数组。指针数组定义的一般形式:类型标识符 *数组名常量;例如:int *p4;定义了一个整型指针数组p,数组元素p0、p1、p2、p3均为指向整型数据的指针。第10章 指针类型 在指针数组的定义中,“*”和“”形式上均为运算符,但“”的优先级比“*”的优先级高

42、。如上面的例子,p先与4结合,形成p4,这显然是数组形式;然后与“*”结合,形成指针数组。注意不要写成int(*p)4,这是指向整个一维数组的指针变量。利用指针数组可以方便地处理多个字符串。例如,在资料管理中,按照一般方法,资料名称本身就是一个字符数组,若有许多资料则必须定义一个二维字符数组,第一维代表不同的资料,第二维代表资料名称。但每一种资料的名字长度不一,若按最长的名字定义第二维,则会造成许多内存单元的浪费。解决此问题的最好方法是用指针描述字符串,用指针数组描述多个字符串。第10章 指针类型例例 10 21 将一些书名按字母顺序输出。例10-21 将一些书名按字母顺序输出。程序如下:/*

43、程序10-21,将一些书名按字母顺序输出*/main()static char *bookname6=basic,pascal,c,java,windows98,office97;void sort();void output();sort(bookname,6);/*调用排序函数*/output(bookname,6);/*输出排序结果*/第10章 指针类型void sort(sname,n)/*排序函数*/char *sname;int n;char *tn;for(i=0;in1;i+)t=i;for(j=i+1;j0)t=j;if(t!=i)tn=snamei;snamei=sname

44、t;snamet=tn;第10章 指针类型void output(oname,n)/*输出函数*/char *oname;int n;int i;for(i=0;in;i+)printf(%s ,onamei);运行结果:basic clanguage java office 97 pascal windows 98 第10章 指针类型10.7.2 多级指针多级指针 若一个指针的基类型是另外一种指针,则称此为多级指针或指针的指针。多级指针的定义形式为:类型标识符 *变量标识符;相当于:(类型标识符 *)*变量标识符;所定义的指针变量指向“类型标识符 *”所描述的指针类型的数据。例如:int *

45、q5,*p=q;第10章 指针类型例例 10 22 将上例中的输出函数改用多级指针实现。void output(oname,n)/*用多级指针实现的输出函数*/char *oname;int n;int i;char *p;/*定义指向指针数组的指针*/p=oname;for(i=0;i1)p+;printf(%s ,*p);argc-;假定以下面的命令行形式运行程序:ECHO HU NAN COMPUTER COLLEGE运行结果:HU NAN COMPUTER COLLEGE 第10章 指针类型10.8 程序设计举例程序设计举例 有关指针的数据型,用实例说明如下:int i;/*整型变量i

46、*/int *p;/*指向整型数据的指针变量p*/int aN;/*整型数组a*/int *pN;/*指针数组p,由N个整型指针组成*/int (*p)N;/*指向整个一维整型数组的指针变量p*/int f();/*整型函数f,返回值为整型数据*/int *p();/*指针函数p,返回值为指向整型数据的指针*/int (*p)();/*指向整型函数的指针变量p*/int *p;/*二级指针变量p,指向一个指向整型数据指针的指针变量*/第10章 指针类型 对于指针变量有两种方法进行初始化:(1)赋值初始化,注意不能赋具体的物理地址。(2)动态分配,使用存储分配函数calloc()、malloc(

47、)申请空间。掌握指针的使用,是最终掌握C语言程序设计关键。程序中经常通过在指针变量和要处理数据之间建立关联来处理数据,一般包括三个步骤:(1)定义以相关数据类型为基类型的指针变量。(2)在指针变量与要处理的数据之间建立关联。(3)使用指针所指向的变量来完成数据处理。有时也可以直接利用指针来处理数据。第10章 指针类型 例例 10 24 逆置数组的元素,即将数组的元素反序存放。数组的逆置只需将第一个元素与最后一个元素交换,第二个元素与倒数第二个元素交换,其余依次类推,交换的次数为数组元素个数的一半。方法一:方法一:不用函数处理。设立两个指针,一个指针指向开头元素,一个指针指向末尾元素,交换两指针

48、所指元素,然后第一个指针后移,第二个指针前移。重复上述步骤,直到两个指针相遇为止。第10章 指针类型程序如下:/*程序10 24 1,用指针逆置数组的元素*/main()static int a10=0,1,2,3,4,5,6,7,8,9;int *i,*j;int t;i=a;j=a+9;for(;ij;i+,j-)t=*i;*i=*j;*j=t;printf(逆置后数组:);for(i=a;ia+10;i+)printf(%3d,*i);运行结果:9 8 7 6 5 4 3 2 1 0 第10章 指针类型方法二方法二:用函数处理,形参、实参均用指针。/*程序10 24 2,用函数逆置数组的

49、元素*/void change(x,n)/*逆置数组的元素的函数*/int *x,n;int *i,*j;int t;i=x;j=x+n-1;for(;ij;i+,j)t=*i;*i=*j;*j=t;main()static int a10=0,1,2,3,4,5,6,7,8,9;int *p;p=a;change(p,10);printf(逆置后数组:);for(p=a;pa+10;p+)printf(%3d,*p);第10章 指针类型 例例 10 25 用矩形法求下列函数的定积分,积分区间由键盘输入。(1)f1(x)=1+x2 (2)f2(x)=1+x2+x4 (3)f3(x)=定义一个求

50、积分的通用函数inte,形式参数为fun、a、b,fun为指向函数的指针,对应被积函数,a、b对应积分区间。主函数中三次调用求积分的通用函数inte,每次调用时分别以f1、f2、f3作为实参函数名,并给出实际的积分区间,求出相应的定积分。)cos(1)sin(xx第10章 指针类型/*程序10 25,求定积分*/define N 100main()float f1(),f2(),f3();float inte();float a,b;float s1,s2,s3;printf(请输入求积区间:)scanf(%f,%f,&a,&b);s1=inte(f1,a,b);/*求第一个函数的定积分*/s

侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|