指针与函数程序设计

上传人:沈*** 文档编号:127954607 上传时间:2022-07-31 格式:PPT 页数:23 大小:1.28MB
收藏 版权申诉 举报 下载
指针与函数程序设计_第1页
第1页 / 共23页
指针与函数程序设计_第2页
第2页 / 共23页
指针与函数程序设计_第3页
第3页 / 共23页
资源描述:

《指针与函数程序设计》由会员分享,可在线阅读,更多相关《指针与函数程序设计(23页珍藏版)》请在装配图网上搜索。

1、第9章 指针与函数程序设计C语言程序设计语言程序设计本章内容本章内容字符查找问题字符查找问题1升降排序问题升降排序问题2 指向函数的指针指向函数的指针返回指针的函数返回指针的函数字符查找问题字符查找问题v在在C语言中,对字符串的操作非常重要。语言中,对字符串的操作非常重要。v除了标准库函数中提供给我们的函数外,很除了标准库函数中提供给我们的函数外,很多时候也自己写一些和字符串操作相关的函多时候也自己写一些和字符串操作相关的函数。数。v在计算机内部,字符串被表示为字符数组。在计算机内部,字符串被表示为字符数组。只要将一个字符串存储到内存,这个字符串只要将一个字符串存储到内存,这个字符串中的字符就

2、都被分配到连续的字节中。中的字符就都被分配到连续的字节中。v在操作字符串的时候,常常需要传递相应的在操作字符串的时候,常常需要传递相应的字符指针,或者返回字符串作为结果,这个字符指针,或者返回字符串作为结果,这个时候字符串的传递常常需要传递指向字符串时候字符串的传递常常需要传递指向字符串的指针。的指针。例例9-1例例9-1 自定义函数查找某个字符是否存在给定的字符串中。自定义函数查找某个字符是否存在给定的字符串中。【分析分析】在在C语言中,字符串可以用字符数组或者字符指针来描述,采语言中,字符串可以用字符数组或者字符指针来描述,采用指针方式更为灵活和方便。用指针方式更为灵活和方便。本例使用返回

3、指针的函数来返回在字符串中找到的子串。本例使用返回指针的函数来返回在字符串中找到的子串。5解析C程序设计第9章 指针与函数程序设计2022-7-31例例9-1 实现代码实现代码/*LI9_1.C*/#include char*strchr(char*string,char letter);int main()char str50=adkfbdfeiomnlp;char a;char*t;printf(please input a character:);scanf(%c,&a);t=strchr(str,a);/*调用查找函数调用查找函数*/if(*t=0)printf(Not Found!n

4、);else printf(Found!n);return 0;char*strchr(char*string,char letter)while(*string!=letter)&(*string)string+;/*当当string所指向字符不是要找的字符,并且串没有结所指向字符不是要找的字符,并且串没有结束时,往后找束时,往后找*/return(string);将函数返将函数返回值赋给回值赋给字符指针字符指针定义定义返回返回字符字符指针指针的函的函数数函数函数返回返回指针指针v本例涉及到返回指针的函数等知识。本例涉及到返回指针的函数等知识。返回指针的函数返回指针的函数 v一个函数可以返回

5、各种类型的数据,当然一个函数可以返回各种类型的数据,当然也可以返回指针类型。也可以返回指针类型。v其定义的一般格式为:其定义的一般格式为:函数类型函数类型*函数名函数名(形式参数类型声明表形式参数类型声明表)函数体函数体例例9-2例例9-2 9-2 用返回指针的函数实现比较字符串大小的用返回指针的函数实现比较字符串大小的函数。函数。【分析分析】比较字符串比较字符串destinationdestination和和sourcesource,当,当destinationdestination大于、小于和等于大于、小于和等于sourcesource时,分别返回时,分别返回0 0、负值和、负值和正值。正

6、值。/*LI9_2.C*/#include char*strcmp(char*destination,char*source);int main()char str150,str250;char*t;printf(please input two strings:);scanf(%s%s,str1,str2);t=strcmp(str1,str2);/*调用查找函数调用查找函数*/if(*t=0)printf(Equal!n);else printf(No equal!n);return 0;char*strcmp(char*destination,char*source)while(*des

7、tination+=*source+);return(destination-1);程序的运行结果如下:程序的运行结果如下:please input two strings:program program Equalplease input two strings:abc abcd No equal举一反三举一反三 例例9-3 9-3 编写一个函数,求字符数组的前编写一个函数,求字符数组的前n n个字符中个字符中最大字符的地址并返回该地址,字符数组和最大字符的地址并返回该地址,字符数组和n n作为函作为函数参数。数参数。/*LI9_3.C*/#include#include char*max(

8、char a,int n);int main()char str50=adfjkdjiuibjklsdmfkdsnfdsf;char*t;int n;n=10;t=max(str,n);printf(The max number is in%p.n,t);return 0;char*max(char a,int n)int i;char max1,*p;max1=a0;p=a;for(i=0;in;i+)if(max1ai)max1=ai;p=&ai;return(p);/*返回指针变量返回指针变量p的值的值*/升降排序问题升降排序问题v排序是计算机中常常需要的一个基本功能,排序是计算机中常常

9、需要的一个基本功能,在大部分情况下,在一个程序中可能只需在大部分情况下,在一个程序中可能只需要简单的升序或者降序的功能,但是有时要简单的升序或者降序的功能,但是有时候可能需要选择排序的方式。候可能需要选择排序的方式。v本节介绍如何利用指向函数的指针来实现本节介绍如何利用指向函数的指针来实现在同一个程序中既能升序又能降序的多用在同一个程序中既能升序又能降序的多用途排序要求。途排序要求。例例9-4v例例9-4 在一个程序中同时实现升序和降序在一个程序中同时实现升序和降序的多用途排序。的多用途排序。v【分析分析】v为了简化排序问题的难度,我们用冒泡排为了简化排序问题的难度,我们用冒泡排序为基本的排序

10、方式。序为基本的排序方式。v冒泡排序中最基本的两个操作就是比较和冒泡排序中最基本的两个操作就是比较和交换。可以分别使用两个函数交换。可以分别使用两个函数bubbleSort和和swap来实现,其中函数来实现,其中函数bubbleSort用来排序数组,函数用来排序数组,函数swap用来实现数据交换。用来实现数据交换。11解析C程序设计第9章 指针与函数程序设计2022-7-31例例9-4 实现代码实现代码/*LI9_4.C*/#include#define SIZE 10void bubblesort(int*array,int size,int(*compare)(int,int);int a

11、scending(int,int);int descending(int,int);int main()int aSIZE=2,6,4,8,10,12,89,68,45,37;int counter,order;printf(Enter 1 to sort in ascending order,n);printf(Enter 2 to sort in descending order:);scanf(%d,&order);/*选择排序方式选择排序方式*/printf(Data item in original order:n);for(counter=0;counterSIZE;counter

12、+)printf(%3d,acounter);/*输出待排序的数输出待排序的数*/if(order=1)bubblesort(a,SIZE,ascending);/*升序排列升序排列*/printf(nData items in ascending order:n);else bubblesort(a,SIZE,descending);/*降序排列降序排列*/printf(nData items in descending order:n);for(counter=0;counterSIZE;counter+)printf(%3d,acounter);/*输出排序结果输出排序结果*/print

13、f(n);return 0;升序升序函数函数名名降序降序函数函数名名12解析C程序设计第9章 指针与函数程序设计2022-7-31例例9-4程序(续)程序(续)/*实现升序或降序的冒泡排序函数,特别注意指向函数的指针作为参数实现升序或降序的冒泡排序函数,特别注意指向函数的指针作为参数*/void bubblesort(int*array,int size,int(*compare)(int,int)int pass,j;void swap(int*,int*);for(pass=1;passsize;pass+)for(j=0;jsize-1;j+)if(*compare)(arrayj,ar

14、rayj+1)/*选择升序或者降序功能选择升序或者降序功能*/swap(&arrayj,&arrayj+1);/*交换数据的函数交换数据的函数*/void swap(int*ptr1,int*ptr2)int temp;temp=*ptr1;*ptr1=*ptr2;*ptr2=temp;/*升序排列的函数升序排列的函数*/int ascending(int a,int b)return ba;指向函指向函数的指数的指针针调用由主调用由主调函数代调函数代入的函数入的函数v本例涉及到指向函数的指针等知识。本例涉及到指向函数的指针等知识。指向函数的指针指向函数的指针 v 在在C语言中,函数名实际上是

15、实现函数功能代码在内存中语言中,函数名实际上是实现函数功能代码在内存中的起始地址,这个地址称为函数的指针,是一个常指针。的起始地址,这个地址称为函数的指针,是一个常指针。v 可以用一个指针变量指向函数,然后通过该指针变量调用可以用一个指针变量指向函数,然后通过该指针变量调用此函数,指向函数的指针简称函数指针。此函数,指向函数的指针简称函数指针。v 函数指针可以作函数参数,也可以作为函数的返回值,还函数指针可以作函数参数,也可以作为函数的返回值,还可以把函数指针存储在数组中,以及把它赋予其他的函数可以把函数指针存储在数组中,以及把它赋予其他的函数指针。指针。v 一般定义形式:一般定义形式:数据类

16、型数据类型 (*指针变量名指针变量名)(参数类型列表参数类型列表);v 一般调用方式:一般调用方式:(*指针变量名指针变量名)(实际参数列表实际参数列表);例例9-5例例9-5 用指向函数的指针实现求两个数的较大值。用指向函数的指针实现求两个数的较大值。/*LI9_5.C*/#include int main()int max(int,int);/*声明函数声明函数*/int(*p)(int,int);/*定义函数指针变量定义函数指针变量*/int a,b,c;p=max;/*函数指针指向函数函数指针指向函数*/scanf(%d,%d,&a,&b);c=(*p)(a,b);/*指针方式调用指针

17、方式调用*/printf(a=%d,b=%d,c=%dn,a,b,c);return 0;/*求较大值函数求较大值函数*/int max(int x,int y)return(xy?x:y);15解析C程序设计第9章 指针与函数程序设计2022-7-31例例9-6例例9-6 用函数指针数组实现菜单下多个函数选择执行的程序。用函数指针数组实现菜单下多个函数选择执行的程序。【分析分析】函数指针具有非常广泛的应用范围,本例函数指针用于菜单函数指针具有非常广泛的应用范围,本例函数指针用于菜单驱动程序。驱动程序。菜单驱动程序提示用户从菜单中选择一个选项,每一个选项菜单驱动程序提示用户从菜单中选择一个选项

18、,每一个选项都由一个不同的函数来完成功能。都由一个不同的函数来完成功能。指向每一个函数的指针存储在一个指向函数的数组中(函数指向每一个函数的指针存储在一个指向函数的数组中(函数指针数组),用户的选择作为数组的下标,然后用数组中的指针数组),用户的选择作为数组的下标,然后用数组中的指针来调用函数。指针来调用函数。16解析C程序设计第9章 指针与函数程序设计2022-7-31例例9-6程序程序/*LI9_6.C LI9_6.C*/#include#include void function1(int);void function1(int);void function2(int);void fun

19、ction2(int);void function3(int);void function3(int);intint main()main()void(void(*f3)(int)=function1,function2,function3;/f3)(int)=function1,function2,function3;/*函数指针数组函数指针数组*/intint choice;choice;printf(Enterprintf(Enter a number between 0 and 2,3 to end:);a number between 0 and 2,3 to end:);scanf

20、(%dscanf(%d,&choice);/,&choice);/*选择不同的菜单选择不同的菜单*/while(choicewhile(choice=0&choice=0&choice3)/*程序重复执行,直到输入程序重复执行,直到输入3 3为止为止*/(*fchoice)(choicefchoice)(choice);/);/*利用函数指针数组调用不同的函数利用函数指针数组调用不同的函数*/printf(Enterprintf(Enter a number between 0 and 2,3 to end:);a number between 0 and 2,3 to end:);scanf

21、(%dscanf(%d,&choice);,&choice);printf(Youprintf(You entered 3 to endn);entered 3 to endn);return 0;return 0;17解析C程序设计第9章 指针与函数程序设计2022-7-31例例9-6程序(续)程序(续)/*以下是三个不同的函数,他们函数名,函数功能各不相同,但是具有相同的参以下是三个不同的函数,他们函数名,函数功能各不相同,但是具有相同的参数列表和函数类型,因此可以利用同样的函数指针进行调用数列表和函数类型,因此可以利用同样的函数指针进行调用*/void function1(int a)p

22、rintf(You entered%d so function1 was calledn,a);void function2(int b)printf(You entered%d so function2 was calledn,b);void function3(int c)printf(You entered%d so function3 was calledn,c);举一反三举一反三例例9-7 编写一个函数,用返回指针的函数实现查找编写一个函数,用返回指针的函数实现查找指定学生的成绩。指定学生的成绩。【分析分析】学生学号从学生学号从0开始,函数开始,函数find()被定义为指针函数,()

23、被定义为指针函数,形参形参pointer是指向包含是指向包含4个元素的一维数组的指针个元素的一维数组的指针变量。变量。pointer+1指向指向score的第一行,的第一行,*(pointer+1)指)指向第一行的第向第一行的第0个元素。个元素。pt是一个指针变量,它指向浮点型变量。是一个指针变量,它指向浮点型变量。main函数中调用函数中调用find函数,将函数,将score数组的首地址数组的首地址传给传给p。19解析C程序设计第9章 指针与函数程序设计2022-7-31例例9-7程序程序/*LI9_7.C*/#include float*find(float(*pionter)4,int

24、n);/*函数指针数组作参数函数指针数组作参数*/int main()static float score4=60,70,80,90,56,89,34,45,34,23,56,45;float*p;int i,m;printf(Enter the number to be found:);scanf(%d,&m);/*输入查找的学生号码输入查找的学生号码*/printf(the score of NO.%d are:n,m);p=find(score,m);/*调用函数调用函数find,返回指定学生成绩的首地址,返回指定学生成绩的首地址*/for(i=0;i4;i+)printf(%5.2ft

25、,*(p+i);/*依次打印成绩依次打印成绩*/return 0;float*find(float(*pionter)4,int n)/*函数指针数组作参数函数指针数组作参数*/float*pt;pt=*(pionter+n);return(pt);/*返回某个学生返回某个学生4门成绩的指针门成绩的指针*/应用实例应用实例例例9-8 编写一个函数,实现以下功能:返回字符串编写一个函数,实现以下功能:返回字符串s1中第一次出现字符中第一次出现字符串串s2的位置,如果的位置,如果s2不出现则返回一个不出现则返回一个NULL。/*LI9_8.C*/#include char*index(char*s

26、tr1,char*str2);/*定位函数,返回指针的函数定位函数,返回指针的函数*/int main()char*s1=watsy wang yan!n;char*s2=at;char*result;result=index(s1,s2);/*返回一个指针返回一个指针*/if(result=NULL)printf(Not Found!);else printf(%s,result);return 0;21解析C程序设计第9章 指针与函数程序设计2022-7-31例例9-8程序程序char*index(char*str1,char*str2)while(*str1!=0)while(*str1

27、=*str2)str1+;str2+;if(*str2=0)return str1;str1+;return NULL;22解析C程序设计第9章 指针与函数程序设计2022-7-31学习建议学习建议v学好程序设计语言的唯一途径是学好程序设计语言的唯一途径是 上机练习上机练习v你的编程能力与你在计算机上调试程序你的编程能力与你在计算机上调试程序投入投入的的时间时间成正比成正比23解析C程序设计第9章 指针与函数程序设计2022-7-31课后作业课后作业v1阅读教材第阅读教材第9章章v2读程序写结果:习题读程序写结果:习题9.1、习题、习题9.2v3读程序写功能:习题读程序写功能:习题9.3、习题、习题9.4v4程序填空:习题程序填空:习题9.5、习题、习题9.6v5程序改错:习题程序改错:习题9.7、习题、习题9.8v6编写程序:习题编写程序:习题9.9习题习题9.16

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!