C语言程序设计(第二版) 教学课件 ppt 作者 刘加海 朱云其第十章第十章

上传人:w****i 文档编号:94379829 上传时间:2019-08-06 格式:PPT 页数:24 大小:351KB
返回 下载 相关 举报
C语言程序设计(第二版) 教学课件 ppt 作者 刘加海 朱云其第十章第十章_第1页
第1页 / 共24页
C语言程序设计(第二版) 教学课件 ppt 作者 刘加海 朱云其第十章第十章_第2页
第2页 / 共24页
C语言程序设计(第二版) 教学课件 ppt 作者 刘加海 朱云其第十章第十章_第3页
第3页 / 共24页
C语言程序设计(第二版) 教学课件 ppt 作者 刘加海 朱云其第十章第十章_第4页
第4页 / 共24页
C语言程序设计(第二版) 教学课件 ppt 作者 刘加海 朱云其第十章第十章_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《C语言程序设计(第二版) 教学课件 ppt 作者 刘加海 朱云其第十章第十章》由会员分享,可在线阅读,更多相关《C语言程序设计(第二版) 教学课件 ppt 作者 刘加海 朱云其第十章第十章(24页珍藏版)》请在金锄头文库上搜索。

1、第10章,指针与函数,Company Logo,本章重点 指针作为函数的参数 函数指针的概念、定义及赋值 函数指针的应用 指数函数的定义 命令行参数的应用,Company Logo,本章难点 指针作为函数的参数时传递的情况 函数指针的概念,函数指针的赋值及调用方法 函数指针在调用中的形式参数及实际参数的使用 指针函数的概念以及与函数指针的区别 命令行参数编程中的文件名与命令的关系 命令行参数的赋值方法,Company Logo,10.1 指针与函数参数,函数的参数可以是变量、变量地址、数组名或指针变量。实际上,函数参数为变量的地址、指针、数组名都属于地址传递的方式。,1. 变量的地址作为函数参

2、数,【例10.1】 变量的地址作为函数参数的例子。,#include void f(int *p) /*由于实参为变量的地址,形参一定是指针*/ printf(“%dn“,*p); void main( ) int x=5; f( /*变量的地址作为实参*/ ,分析:参数传递的情况如图10.1所示,由于实参为变量的地址,形参一定是指针,因为只有指针才能指向变量的地址。变量x的地址传给指针p,p的值为&x,即指针p指在x的地址上,指针p所指的地址上的内容即为变量x的值。,图10.1 变量的地址传递给指针,Company Logo,下列程序中的函数fun是以变量的地址作为函数参数传递,请分析程序执

3、行的结果。 #include void fun(int *p) *p=*p0?*p:-*p; void main( ) int x; printf(“input a numn“); printf(“input a numn“); scanf(“%d“, ,Company Logo,2. 指针作为函数的参数,【例10.2】 指针变量作为函数参数的例子。,#include void f(int *p) printf(“%dn“,*p); void main( ) int x=5,*p; p= ,分析:参数传递的情况如图10.2所示。实参为指针,形参也一定是指针,因为只有指针才能指向变量的地址。实参

4、p指向变量x的地址,传给指针p,p的值为&x,即指针p指在x的地址上,指针p所指的地址上的内容即为变量x的值。,Company Logo,图10.2 变量的地址传递给指针,Company Logo,【例10.3】通过调用函数,函数的参数为指针,在函数中交换两数。,#include void swap(int *p1,int *p2) int p; p=*p1; *p1=*p2; *p2=p; void main( ) int a,b; int *p1,*p2; scanf(“%d,%d“, ,假定程序在执行时,从键盘输入3、5(回车),即a、b的值分别为3、5,此时调用函数swap(p1,p2

5、),在函数swap中使得指针p1、p2所指的地址上的内容进行交换,即a、b的值交换,如下页所示。,Company Logo,(b)执行到函数swap中语句*p2=p;时的参数情况,(a)执行到函数swap中语句int p;时的参数传递情况,(c)回到main函数时,形参p、p1、p2被释放,a、b的值已交换,实参、形参相互关系,Company Logo,1. 如有下列形式的函数参数,当用swap( ,Company Logo,【例10.4】 在main函数中读入两个字符串,调用自定义函数strcmp,比较两个字符串的大小,实参用数组名,形参用指针。,分析:字符串比较时,返回的是第一个不同字符的

6、差值。因而函数的返回值类型为int,函数的原型可以写成,int strcmp(char *p1,char *p2);,#include int strcmp(char *s1,char *s2) for(;*s1!=0;s1+,s2+) if(*s1!=*s2) break; return(*s1-*s2); void main( ) char str190,str290; gets(str1); gets(str2); printf(“%dn“,strcmp(str1,str2); ,程序设计如右所示:,Company Logo,【例10.5】 在main函数中读入一个由数字字符组成的字符串

7、,把此字符串作为函数的参数,调用此函数,把它转换为一个整型数,返回到main函数。,分析:用表达式*p-0把一个数字字符转化为数字,如字符串“12“,计算1-0得到1,然后乘10,再加上2-0,程序的流程如图10.4所示。,图10.4 程序流程图,源程序代码10-5.c,Company Logo,【例10.6】 设计一个程序,在main( )中输入一个字符串,然后再输入一个字符,调用一个函数void del_char(char *p,char x),删除指针p所指字符串中的字符x。,分析:函数的流程图如图10.5所示。,图10.5 流程图,源程序代码10-6.c,Company Logo,10

8、.2 指向函数的指针,一个函数在编译时被分配存储空间,这个存储空间的首地址叫做函数的入口地址。可以用一个函数指针指向此入口地址,然后通过该指针变量调用此函数。,10.2.1 用函数指针变量调用函数,1. 函数指针的声明,函数指针的声明格式如下: 数据类型 (*指针变量名)(函数形参类型标识符列表); 例如: char (*p1)(char *,int); 上述语句声明两个指向函数的指针:p1指向形参类型依次为char*、int,返回值类型为char的函数。,2. 为指向函数的指针赋值,函数名是指针常量,其值为该函数在内存中存储区域的首地址。只能将函数的首地址赋值到指向同类型函数的指针。 函数指

9、针赋值格式如下: 函数指针函数名;,Company Logo,3. 函数指针的调用方式,当函数指针指向某个函数的入口地址后,就可以用此指针调用函数,其格式如下: (*指针名)(实在参数列表);,【例10.7】 用函数指针调用求最大值函数,求出a和b中的最大值。,分析:函数占有一段内存单元,可用函数指针变量指向其首地址,通过指针变量来访问它所指向的函数。,注意: 1)int(*p)(int , int);指向函数的指针变量p,此函数返回值为int型。 2)int(*p)(int,int);(*p)两侧的括弧不可省略,请读者思考为什么? 3)给函数指针变量赋值时只赋函数名,不准带参数。如: p=m

10、ax; 其作用是将函数max的入口地址赋给指针变量p,函数名代表函数的入口地址。 4)通过函数指针调用时的实参(*p)(a,b);与函数的形参要完全一致。 5)对指向函数的指针变量不准作加减运算,如p+,p-,p+n都是错误的。,源程序代码10-7.c,Company Logo,【例10.8】 已知契比雪夫多项式的定义如下:,试编写程序,从键盘输入整数n和实数x,并计算多项式的值。,源程序代码10-8.c,Company Logo,10.3 返回值为指针的函数,函数被调用后,可以由函数中的return语句返回一个值到主调函数中。函数的返回值可以是整型值、字符值、实型值等,也可以是返回指针型的数

11、据,即地址。返回值为指针的函数,与以前的函数概念类似,只是返回的值的类型是指针类型而已,此类函数通常称为指针函数。 指针函数定义形式如下: 类型名 *函数名(形参表定义) 函数体 例如: int *func(int x,int y); 其中,func是函数名,其返回值类型是“指向整型的指针”,也即函数值是一个指针,指向一个整型变量,函数的形参为int x 和int y。,Company Logo,【例10.10】 由键盘输入112自然数,再调用指针函数输出英文名。,分析:在被调用程序中应定义指针函数。,源程序代码10-10.c,【例10.11】 编写一函数,在一组字符串中找出按字典序最大的字符

12、串。,程序运行结果如下: abcd,源程序代码10-11.c,Company Logo,【例10.12】 有若干学生的成绩(每个学生四门课程),要求用户在输入学生序号(假设从0号开始)后,能输出该学生的全部成绩。,#include float * search( float (*pointer)4, int n) ; /*函数原型声明 */ void main() static float score4 =65,70,80,90,76,89,67,88,84,78,90,76 ; float *p; int i, num; printf(“Enter the number of student

13、:“); scanf(“%d“, ,Company Logo,10.4 命令行参数,10.4.1 命令行参数的概念,字符指针数组可作为main函数的参数,在程序执行时由命令行传入,即所谓的“命令行参数”。命令行参数的程序设计过程如下: 1)设计一个程序,其中main函数带两个参数,其中一个是指向命令行的指针数组,另一个为命令行参数的个数。main函数的形式如下: void main(int argc, char *argv ) 2)编写程序,main函数所在的.c文件名即为命令名。 3)编译程序。 4)在dos环境下执行程序,其形式如下: 命令名 参数1 参数2 . 参数n(回车),注意:命令

14、名和各参数之间用空格分隔。,Company Logo,DOS操作系统的大多数命令是带参数的,其命令是main函数带参数的方法编写而成。 例如,首先编辑一个名为echo.c(或echo.cpp)的文件,此文件中的main函数带两个参数,然后经过编译、链接后产生echo.exe文件,最后在dos命令提示符下输入带参数的命令行echo Zhejiang Hangzhou并按回车键即可。若有一命令文件名为echo,现要将两个字符串“Zhejiang“,“Hangzhou“作为参数传送给main函数。,【例10.14】 编写一程序,显示命令行上的所有参数(不包括命令名),源程序名为echo.c。,源程序

15、代码10-14.c,Company Logo,编译链接后生成应用程序文件echo.exe,进入DOS环境,在命令行输入: echo Zhejiang Hangzhou 程序运行结果如下: Zhejiang Hangzhou 程序运行时,系统自动作如下赋值:命令行参数的个数(含命令)3赋给argc,因为输入的参数为3个,分别为echo、zhejiang、Hangzhou。 argv0指向字符串“echo“的首地址;argv1指向字符串“Zhejiang“的首地址;argv2指向字符串“Hangzhou“的首地址。 注意: 1)形参argc是命令行中参数的个数,可执行文件名本身也算一个,以空格分隔

16、。 2)形参argv是一个字符指针数组,argv是一个数组名,元素个数为形参argc的值,其元素为指向命令行字符串的指针,指针数组argvargc-1分别指向命令行各参数的首地址。,Company Logo,【例10.15】 用一程序实现文件的加密和解密。约定:c程序取名为lock.c,程序的可执行文件名为lock.exe,其用法如下: lock +|- 其中,“+”为加密,“-”为解密。,分析:通过main函数带参数的方法编写程序,文件被加密还是解密、被操作的文件是什么均由命令行参数决定。如在执行时输入: lock + liu.txt 表示对文件liu.txt进行加密处理,随后要求您输入加密的密钥。如输入: lock - liu.txt 表示对文件liu.txt进行解密处理

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

最新文档


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

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