第8章函数.ppt
《第8章函数.ppt》由会员分享,可在线阅读,更多相关《第8章函数.ppt(103页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第8 8章章 函数函数8.1 8.1 概述概述一个一个一个一个C C程序,由一个主函数和若干其它函数组成,它们之间程序,由一个主函数和若干其它函数组成,它们之间程序,由一个主函数和若干其它函数组成,它们之间程序,由一个主函数和若干其它函数组成,它们之间的关系是:的关系是:的关系是:的关系是:主函数可以调用其它函数,其它函数可相互调用。主函数可以调用其它函数,其它函数可相互调用。主函数可以调用其它函数,其它函数可相互调用。主函数可以调用其它函数,其它函数可相互调用。函数:完成特定功能的程序段,通常由用户定义或系统定义函数:完成特定功能的程序段,通常由用户定义或系统定义函数:完成特定功能的程序段
2、,通常由用户定义或系统定义函数:完成特定功能的程序段,通常由用户定义或系统定义各函数可存放在一个文件中,也可以存放在不同的文件中。各函数可存放在一个文件中,也可以存放在不同的文件中。各函数可存放在一个文件中,也可以存放在不同的文件中。各函数可存放在一个文件中,也可以存放在不同的文件中。某程序整体结构,某程序整体结构,某程序整体结构,某程序整体结构,mainmaina ab bc cd de ef fg gh hh hi ie eg g程序运行轨迹:程序运行轨迹:程序运行轨迹:程序运行轨迹:mainmaina a d d a a e e a a main main b b f f e e f f
3、 b b g g b b h h b b main main c c h h g g h h c c i i c c mainmain 对于较大的程序来说,往往把其中相对独立的算法和功能对于较大的程序来说,往往把其中相对独立的算法和功能对于较大的程序来说,往往把其中相对独立的算法和功能对于较大的程序来说,往往把其中相对独立的算法和功能定义成一个独立的函数,以供需要的地方调用。定义成一个独立的函数,以供需要的地方调用。定义成一个独立的函数,以供需要的地方调用。定义成一个独立的函数,以供需要的地方调用。将一个程序分解成多个函数有如下将一个程序分解成多个函数有如下将一个程序分解成多个函数有如下将一个
4、程序分解成多个函数有如下优点优点优点优点:(1 1)减少代码的重复现象。减少代码的重复现象。减少代码的重复现象。减少代码的重复现象。(2 2)便于分工合作。便于分工合作。便于分工合作。便于分工合作。(3 3)便于阅读。便于阅读。便于阅读。便于阅读。(4 4)便于独立算法的代码移植。便于独立算法的代码移植。便于独立算法的代码移植。便于独立算法的代码移植。例例例例8.18.1void void main()main()p1();p1();p2();p2();p1();p1();p1()p1()printf(“*n”);printf(“*n”);p2()p2()printf(“_ _ _ _ _Ho
5、w_do_you_do!n”);printf(“_ _ _ _ _How_do_you_do!n”);运行结果:运行结果:运行结果:运行结果:*_ _ _ _ _How_do_you_do!_ _ _ _ _ _ _ _How_do_you_do!_ _ _ _*说明:说明:说明:说明:(1 1)编译的单位是文件而不是函数;)编译的单位是文件而不是函数;)编译的单位是文件而不是函数;)编译的单位是文件而不是函数;(2 2)一个完整的程序可由若干个文件组成,可用项目或文件包含)一个完整的程序可由若干个文件组成,可用项目或文件包含)一个完整的程序可由若干个文件组成,可用项目或文件包含)一个完整的程
6、序可由若干个文件组成,可用项目或文件包含的方法对其编译;的方法对其编译;的方法对其编译;的方法对其编译;(3 3)C C执行总是从执行总是从执行总是从执行总是从mainmain函数开始执行,调用其它函数后又返回到函数开始执行,调用其它函数后又返回到函数开始执行,调用其它函数后又返回到函数开始执行,调用其它函数后又返回到mainmain函数;函数;函数;函数;(4 4)函数定义是独立的、平等的,不能嵌套定义但可相互调用;)函数定义是独立的、平等的,不能嵌套定义但可相互调用;)函数定义是独立的、平等的,不能嵌套定义但可相互调用;)函数定义是独立的、平等的,不能嵌套定义但可相互调用;(5 5)函数的
7、类型)函数的类型)函数的类型)函数的类型:标准库函数,由系统提供,用户直接使用标准库函数,由系统提供,用户直接使用标准库函数,由系统提供,用户直接使用标准库函数,由系统提供,用户直接使用 用户定义的函数用户定义的函数用户定义的函数用户定义的函数(6)(6)函数的形式函数的形式函数的形式函数的形式:无参函数无参函数无参函数无参函数 主调函数无数据传给被调函数主调函数无数据传给被调函数主调函数无数据传给被调函数主调函数无数据传给被调函数,可带或不带返回值可带或不带返回值可带或不带返回值可带或不带返回值.有参函数有参函数有参函数有参函数 主调函数与被调函数间有参数传递主调函数与被调函数间有参数传递主
8、调函数与被调函数间有参数传递主调函数与被调函数间有参数传递,主调函数可将主调函数可将主调函数可将主调函数可将实参传送给被调函数的形参实参传送给被调函数的形参实参传送给被调函数的形参实参传送给被调函数的形参,被调函数的数据可传回主调函数。被调函数的数据可传回主调函数。被调函数的数据可传回主调函数。被调函数的数据可传回主调函数。8.2 8.2 函数定义的一般形式函数定义的一般形式1.1.无参函数的定义形式:无参函数的定义形式:无参函数的定义形式:无参函数的定义形式:类型标识符类型标识符类型标识符类型标识符 函数名(函数名(函数名(函数名()声明部分声明部分声明部分声明部分 语句部分语句部分语句部分
9、语句部分 注:无参函数一般不返回函数值,故类型标识符可省。注:无参函数一般不返回函数值,故类型标识符可省。注:无参函数一般不返回函数值,故类型标识符可省。注:无参函数一般不返回函数值,故类型标识符可省。2.2.有参函数的定义形式:有参函数的定义形式:有参函数的定义形式:有参函数的定义形式:类型标识符类型标识符类型标识符类型标识符 函数名(形式参数表列)函数名(形式参数表列)函数名(形式参数表列)函数名(形式参数表列)声明部分声明部分声明部分声明部分 语句部分语句部分语句部分语句部分 其中:其中:其中:其中:类型标识符:指出函数返回值的数据类型类型标识符:指出函数返回值的数据类型类型标识符:指出
10、函数返回值的数据类型类型标识符:指出函数返回值的数据类型 (int,float,charint,float,char等等等等)函数名:合法的标识符;函数名:合法的标识符;函数名:合法的标识符;函数名:合法的标识符;形参表列:接收主调函数传递过来的实参,其中包括对形形参表列:接收主调函数传递过来的实参,其中包括对形形参表列:接收主调函数传递过来的实参,其中包括对形形参表列:接收主调函数传递过来的实参,其中包括对形参类型的声明(老版本中形参类型进一步声明放在下一行)。参类型的声明(老版本中形参类型进一步声明放在下一行)。参类型的声明(老版本中形参类型进一步声明放在下一行)。参类型的声明(老版本中形
11、参类型进一步声明放在下一行)。形参类型:与实参类型要一致。形参类型:与实参类型要一致。形参类型:与实参类型要一致。形参类型:与实参类型要一致。:称函数体,包括:称函数体,包括:称函数体,包括:称函数体,包括 声明部分:定义局部变量的数据类型;声明部分:定义局部变量的数据类型;声明部分:定义局部变量的数据类型;声明部分:定义局部变量的数据类型;语句部分:完成函数功能的若干执行语句。语句部分:完成函数功能的若干执行语句。语句部分:完成函数功能的若干执行语句。语句部分:完成函数功能的若干执行语句。例:例:例:例:int max(int x,int y)int max(int x,int y)int
12、z;int z;z=xy?x:y ;return(z);z=xy?x:y ;return(z);3.3.空函数的定义形式空函数的定义形式空函数的定义形式空函数的定义形式类型说明符类型说明符类型说明符类型说明符 函数名(函数名(函数名(函数名()例:例:例:例:dummi()dummi()空函数不作任何操作,但是合法,它对调试程序或以后在此空函数不作任何操作,但是合法,它对调试程序或以后在此空函数不作任何操作,但是合法,它对调试程序或以后在此空函数不作任何操作,但是合法,它对调试程序或以后在此处补充完整的函数体是处补充完整的函数体是处补充完整的函数体是处补充完整的函数体是 有作用的。有作用的。有
13、作用的。有作用的。4.4.对形参声明的传统方式对形参声明的传统方式对形参声明的传统方式对形参声明的传统方式传统方式中,形参类型说明在函数定义的第传统方式中,形参类型说明在函数定义的第传统方式中,形参类型说明在函数定义的第传统方式中,形参类型说明在函数定义的第2 2行行行行如:传统形参声明形式如:传统形参声明形式如:传统形参声明形式如:传统形参声明形式int max(x,y)int max(x,y)int x,y;int x,y;int z;int z;z=xy?x:y;z=xy?x:y;return(z);return(z);新版本形参声明形式新版本形参声明形式新版本形参声明形式新版本形参声明
14、形式int max(int x,int y)int max(int x,int y)int z;int z;z=xy?x:y;z=xy?x:y;return(z);return(z);以上两种定义形式在以上两种定义形式在以上两种定义形式在以上两种定义形式在Turbo CTurbo C中都认可中都认可中都认可中都认可8.3 8.3 函数参数和函数的值函数参数和函数的值8.3.1 8.3.1 8.3.1 8.3.1 形式参数和实际参数形式参数和实际参数形式参数和实际参数形式参数和实际参数实际参数:实际参数:实际参数:实际参数:主调函数中提供的数据。主调函数中提供的数据。主调函数中提供的数据。主调函
15、数中提供的数据。可以是常量、变量、表达式等,是具体的数值。可以是常量、变量、表达式等,是具体的数值。可以是常量、变量、表达式等,是具体的数值。可以是常量、变量、表达式等,是具体的数值。形式参数:形式参数:形式参数:形式参数:被调函数中用以接收主调函数数据的变量。被调函数中用以接收主调函数数据的变量。被调函数中用以接收主调函数数据的变量。被调函数中用以接收主调函数数据的变量。被调用函数名后面括号内的若干变量名。被调用函数名后面括号内的若干变量名。被调用函数名后面括号内的若干变量名。被调用函数名后面括号内的若干变量名。例例例例8.2 8.2 调用函数时的数据传递调用函数时的数据传递调用函数时的数据
16、传递调用函数时的数据传递void void main()main()int a,b,c;int a,b,c;scanf(%d%d”,&a,&b);scanf(%d%d”,&a,&b);c=max(a,b);c=max(a,b);printf(“Max is%d n”,c);printf(“Max is%d n”,c);max(int x,int y)max(int x,int y)int z;int z;z=xy?x:y;z=xy?x:y;return(z);return(z);输入:输入:输入:输入:-100 200-100 200 Max is 200 Max is 200关于形、实参的说
17、明:关于形、实参的说明:关于形、实参的说明:关于形、实参的说明:1.1.形参只有在函数调用时才分配存储单元,调用结束后,释放形参只有在函数调用时才分配存储单元,调用结束后,释放形参只有在函数调用时才分配存储单元,调用结束后,释放形参只有在函数调用时才分配存储单元,调用结束后,释放所分配的单元;所分配的单元;所分配的单元;所分配的单元;2.2.实参可以是常量、变量、表达式,总之要有确定的值,当函实参可以是常量、变量、表达式,总之要有确定的值,当函实参可以是常量、变量、表达式,总之要有确定的值,当函实参可以是常量、变量、表达式,总之要有确定的值,当函数调用时,将实参的值传递给形参,若是数组名,则传
18、送的数调用时,将实参的值传递给形参,若是数组名,则传送的数调用时,将实参的值传递给形参,若是数组名,则传送的数调用时,将实参的值传递给形参,若是数组名,则传送的是数组的首地址。是数组的首地址。是数组的首地址。是数组的首地址。3.3.被调函数中,形参类型必须指定,以便分配存储单元。被调函数中,形参类型必须指定,以便分配存储单元。被调函数中,形参类型必须指定,以便分配存储单元。被调函数中,形参类型必须指定,以便分配存储单元。4.4.实参、形参的数据类型一致,赋值要兼容,顺序要一致。实参、形参的数据类型一致,赋值要兼容,顺序要一致。实参、形参的数据类型一致,赋值要兼容,顺序要一致。实参、形参的数据类
19、型一致,赋值要兼容,顺序要一致。如果形、实参类型不一致时,则按赋值规则进行。通常被调函如果形、实参类型不一致时,则按赋值规则进行。通常被调函如果形、实参类型不一致时,则按赋值规则进行。通常被调函如果形、实参类型不一致时,则按赋值规则进行。通常被调函数放在主调函数之前,以便编译系统对函数类型和形参类型作数放在主调函数之前,以便编译系统对函数类型和形参类型作数放在主调函数之前,以便编译系统对函数类型和形参类型作数放在主调函数之前,以便编译系统对函数类型和形参类型作合法性检查。若被调函数在主调函数之后,一般要对被调函数合法性检查。若被调函数在主调函数之后,一般要对被调函数合法性检查。若被调函数在主调
20、函数之后,一般要对被调函数合法性检查。若被调函数在主调函数之后,一般要对被调函数作原型声明。作原型声明。作原型声明。作原型声明。void void main()main()float a=4.5,b=4.5;float a=4.5,b=4.5;int abc(int,int);int abc(int,int);abc(a,b);abc(a,b);abc(int x,int y)abc(int x,int y)printf(“x=%d,y=%dn”,x,y);printf(“x=%d,y=%dn”,x,y);结果:结果:结果:结果:x=4,y=4x=4,y=45.5.若被调函数类型为非整形,要在
21、主调函数中对被调函数作原若被调函数类型为非整形,要在主调函数中对被调函数作原若被调函数类型为非整形,要在主调函数中对被调函数作原若被调函数类型为非整形,要在主调函数中对被调函数作原形声明。另外若被调函数在主调函数之前定义,则原形声明形声明。另外若被调函数在主调函数之前定义,则原形声明形声明。另外若被调函数在主调函数之前定义,则原形声明形声明。另外若被调函数在主调函数之前定义,则原形声明可省,因为编译系统已经知道被调函数的类型的其形参的个可省,因为编译系统已经知道被调函数的类型的其形参的个可省,因为编译系统已经知道被调函数的类型的其形参的个可省,因为编译系统已经知道被调函数的类型的其形参的个数的
22、类型了。数的类型了。数的类型了。数的类型了。6.6.实参对形参的数据传送是值传送,也是单向传送,当被调函实参对形参的数据传送是值传送,也是单向传送,当被调函实参对形参的数据传送是值传送,也是单向传送,当被调函实参对形参的数据传送是值传送,也是单向传送,当被调函数的形参发生变化时,并不改变主调函数实参的值。数的形参发生变化时,并不改变主调函数实参的值。数的形参发生变化时,并不改变主调函数实参的值。数的形参发生变化时,并不改变主调函数实参的值。例例例例8.2.1 8.2.1 形、实参占据的是不同的存储单元形、实参占据的是不同的存储单元形、实参占据的是不同的存储单元形、实参占据的是不同的存储单元 v
23、oid void main()main()int a=2,b=3;int a=2,b=3;printf(“a=%d,b=%d n”,a,b);printf(“a=%d,b=%d n”,a,b);printf(“&a=%x,&b=%xn”,&a,&b);printf(“&a=%x,&b=%xn”,&a,&b);add(a,b);add(a,b);printf(“a=%d,b=%dn”,a,b);printf(“a=%d,b=%dn”,a,b);printf(“&a=%x,&b=%xn”,&a,&b);printf(“&a=%x,&b=%xn”,&a,&b);add(int x,int y)add
24、(int x,int y)x=x+8;y=y+12;x=x+8;y=y+12;printf(“x=%d,y=%d n”,x,y);printf(“x=%d,y=%d n”,x,y);printf(“&x=%x,&y=%xn”,&x,&y);printf(“&x=%x,&y=%xn”,&x,&y);2+8=102+8=103+12=153+12=152 23 3ffd2ffd2ffd4ffd4ffd6ffd6ffd8ffd8x xa ay yb b运行结果:运行结果:运行结果:运行结果:a=2,b=3a=2,b=3&a=ffd6,&b=ffd8&a=ffd6,&b=ffd8x=10,y=15x=
25、10,y=15&x=ffd2,&y=ffd4&x=ffd2,&y=ffd4a=2,b=3a=2,b=3&a=ffd6,&b=ffd8&a=ffd6,&b=ffd8 8.3.2 函数的返回值函数的返回值调用一个函数一般都希望返回一个确定的值。调用一个函数一般都希望返回一个确定的值。调用一个函数一般都希望返回一个确定的值。调用一个函数一般都希望返回一个确定的值。有关函数值的几点说明:有关函数值的几点说明:有关函数值的几点说明:有关函数值的几点说明:1.1.若需要返回值则用若需要返回值则用若需要返回值则用若需要返回值则用returnreturn语句;语句;语句;语句;2.2.被调函数中可用多个被调函
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第8章 函数
限制150内