资源预览内容
第1页 / 共88页
第2页 / 共88页
第3页 / 共88页
第4页 / 共88页
第5页 / 共88页
第6页 / 共88页
第7页 / 共88页
第8页 / 共88页
第9页 / 共88页
第10页 / 共88页
亲,该文档总共88页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
7.1 函数7.2 函数的定义7.3 函数的参数和返回值7.4 函数的调用7.5 函数的嵌套与递归调用 7.6 数组与函数参数 7.7 指针与函数7.8 变量的存储类别 7.9 模块化程序设计方法 补充:如何运行一个多文件的程序,第七章 函数与模块化程序设计方法,一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能一个C程序可由一个主函数和若干个函数构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。下图是一个程序中函数调用的示意图:,函数概述,main() /* 主函数 */ print_star(); /*调用print_star函数画*/ print_message(); /*调用print _message函数写字*/ print_star(); /*调用print_star函数画*/ print_star() /*定义print_star函数*/ prinf(“n*”); print_message() /*定义print_message函数*/ prinf(“n Hello! ”); ,函数调用例:,运行结果:* Hello! *,说明:,(1)一个源程序文件由一个或多个函数组成。一个源程序文件 是一个编译单位,即以源程序为单位进行编译,而不是以 函数为单位进行编译。,(2)一个C程序由一个或多个源程序文件组成。一个源文件可 以为多个C程序公用。,(3)C程序的执行从main函数开始,调用其他函数后流程回到 main函数,在main函数中结束整个程序的运行。main函数 是系统定义的。,(4)所有函数都是平行的,即在定义函数时是互相独立的,一 个函数并不从属于另一函数,函数间可以互相调用,但不 能调用main函数。,(5)从用户使用的角度看,函数有两种:, 标准函数,即库函数。这是由系统提供的,用户不必自己 定义这些函数,可以直接使用它们。 用户自己定义的函数。用以解决用户的专门需要。,(6)从函数的形式看,函数分两类:, 无参函数。, 有参函数。在调用函数时,在主调函数和被调用函数之间 有数据传递。也就是说,主调函数可以将数据传给被调用 函数使用,被调用函数中的数据也可以带回来供主调函数 使用。,1、无参函数的定义形式,类型标识符 函数名() 声明部分 语句 ,2、有参函数定义的一般形式,类型标识符 函数名(形式参数表列) 声明部分 语句 ,函数的定义,例如: int max(int x,int y) int z; z=xy? x:y; return(z); ,3、可以有“空函数”,它的形式为: 类型说明符 函数名() ,例如: dumy() ,4、对形参的声明的传统方式,在老版本C语言中,对形参类型的声明是放在函数定义的第2行,也就是不在第l行的括号内指定形参的类型,而在括号外单独指定,例如:,int max(x,y)int x,y; int z; z=xy?x:y; return(z); ,一般把这种方法称为传统的对形参的声明方式,而把前面介绍过的方法称为现代的方式。Turbo C和目前使用的多数C版本对这两种方法都允许使用,两种用法等价。,1、形式参数和实际参数,在定义函数时函数名后面括弧中的变量名称为“形式参数”,在主调函数中调用一个函数时,函数名后面括弧中的参数(可以是一个表达式)称为“实际参数”。,函数的参数和返回值,例:调用函数时的数据传递,main() int a,b,c; scanf(“%d,%d”, ,运行情况: 7,8 Max is 8,(1)在定义函数中指定的形参,在未出现函数调用时,它们并 不占内存中的存储单元。只有在发生函数调用时,函数 max中的形参才被分配内存单元。在调用结束后,形参所 占的内存单元也被释放。,(2)实参可以是常量、变量或表达式,如: max(3,a+b); 但要求它们有确定的值。在调用时将实参的值赋给形参 (如果形参是数组名,则传递的是数组首地址而不是数组 的值)。,关于形参与实参的说明:,(3)在被定义的函数中,必须指定形参的类型。,(4)实参与形参的类型应相同或赋值兼容。,(5)C语言规定,实参变量对形参变量的数据传递是“值传递”, 即单向传递,只由实参传给形参,而不能由形参传回来给 实参,在调用函数时,给形参分配存储单元,并将实参对 应的值传递给形参,调用结束后,形参单元被释放,实参 单元仍保留并维持原值。,函数的返回值,(1)函数的返回值是通过函数中的return语句获得的。return 语句将被调用函数中的一个确定值带回主调函数中去。 return 语句后面的括弧也可以不要,如: return z;,return后面的值可以是一个表达式。 max(int x,int y) return(xy?x:y); ,(2)函数值的类型。,在定义函数时指定函数值的类型。例如:,int max(float x,float y) 函数值为整型char letter(char c1,char c2) 函数值为字符型double min(int x,int y) 函数值为双精度型,C语言规定,凡不加类型说明的函数,一律自动按整型处理。在定义函数时对函数值说明的类型一般应该和return语句中的表达式类型一致。,例 返回值类型与函数类型不同。,main() float a,b; int c; scanf(“%f,%f,”, ,运行情况如下:1.5,2.5Max is 2,(3)如果函数值的类型和return语句中表达式的值不一致,则 以函数类型为准。对数值型数据,可以自动进行类型转 换。即函数类型决定返回值的类型。,(4)如果被调用函数中没有return语句,并不带回一个确定的、 用户所希望得到的函数值,但实际上,函数并不是不带回 值,而只是不带回有用的值。带回的是一个不确定的值。,(5)为了明确表示“不带回值”,可以用“void”定义“无类型” (或称“空类型”),1、函数调用的一般形式,函数名(实参表列);,如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略,如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应一致。实参与形参按顺序对应,一一传递数据。如果实参表列包括多个实参,对实参求值的顺序并不是确定的,有的系统按自左至右顺序求实参的值,有的系统则按自右至左顺序。 许多 C版本(例如 Turbo C和 MS C)是按自右而左的顺序求值。,函数的调用,2、函数调用的方式,按函数在程序中出现的位置来分,可以有以下三种函数调用方式:,(1)函数语句,把函数调用作为一个语句。如: printstar();,(2)函数表达式,函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如: c=2*max(a,b);,(3)函数参数,函数调用作为一个函数的实参。例如:m=max(a,max(b,c);,3、对被调用函数的声明和函数原型,在一个函数中调用另一函数(即被调用函数)需要具备的条件,(1)首先被调用的函数必须是已经存在的函数(是库函数或用 户自己定义的函数)。,(2)如果使用库函数,一般还应该在本文件开头用include命 令将调用有关库函数时所需用到的信息“包含”到本文件中 来。例如,前几章中已经用过的 include ,(3)如果使用用户自己定义的函数,而且该函数与调用它的函 数(即主调函数)在同一个文件中,一般还应该在主调函 数中对被调用的函数作声明,即对编译系统声明将要调用 此函数,并将有关信息通知编译系统。,例 对被调用的函数作声明,main() float add(float x,float y); /对被调用函数的声明 / float a,b,c; scanf(“%f,%f”, ,运行情况如下:3.6,6.5sum is 10.000000,在函数声明中也可以不写形参名,而只写形参的类型。如: float add(float,float);,在C语言中,以上的函数声明称为函数原型(function prototype)。 它的作用主要是利用它在程序的编译阶段对调用函数的合 法性进行全面检查。,函数原型的一般形式为, 函数类型 函数名(参数类型1,参数类型2), 函数类型 函数名(参数类型1,参数名1,参数类型2, 参数名2),第种形式是基本的形式。为了便于阅读程序,也允许在函数原型中加上参数名,就成了第种形式。但编译系统不检查参数名。因此参数名是什么都无所谓。,说明:, 如果在函数调用之前,没有对函数作声明,则编译系统会把第一次遇到的该函数形式(函数定义或函数调用)作为函数的声明,并将函数类型默认为int型。,如果函数类型为整型,可以在函数调用前不必作函数声明。但是使用这种方法时,系统无法对参数的类型做检查。若调用函数时参数使用不当,在编译时也不会报错。因此,为了程序清晰和安全,建议都加以声明为好。, 如果被调用函数的定义出现在主调函数之前,可以不必加以 声明。, 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必对所调用的函数再作声明。例如:,char letter(char,char); /以下3行在所有函数之前,且在函数外部 /float f(float,float);int i(float,float);main() / 不必声明它所调用的函数 /char letter(char c1,char c2) / 定义letter函数 / float f(float x,float y) / 定义f函数 / int i(float j,float k) / 定义i函数 / ,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号