《C语言程序设计 工业和信息化普通高等教育十二五 规划教材立项项目 教学课件 ppt 作者 赵山林 高媛 第六章 函数》由会员分享,可在线阅读,更多相关《C语言程序设计 工业和信息化普通高等教育十二五 规划教材立项项目 教学课件 ppt 作者 赵山林 高媛 第六章 函数(40页珍藏版)》请在金锄头文库上搜索。
1、第六章 函数,Page 2,6.1 概述,函数概述 C语言程序由函数组成,函数是程序的基本组成单位。使用函数可以方便地实现程序模块化设计。函数是为了实现特定功能,按照C语言函数定义规则而编写的相对独立的程序段。函数就象一个黑盒子,需要使用函数功能时,只需通过函数接口传递所需要的数据就可以得到相应的结果,而不必知道函数内部是如何实现函数功能的。对函数的使用称为函数调用。 C语言程序中,每个函数都要完成一定的功能。必须先定义函数的功能,然后才能通过函数调用,实现函数的功能,即函数必须先定义,后使用。因此要掌握函数,必须先了解函数定义、声明和调用等基本概念。,Page 3,6.1 概述,函数概述 1
2、函数定义 函数定义包括函数说明部份与函数体两部分。 函数说明部分是函数有关信息的说明,又称函数头。包括函数类型、函数名称、形式参数的类型、名称和数量。函数已知数据用形式参数表示;函数类型是函数实现功能后结果的类型。 函数体是函数功能的实现,实现函数功能的程度段书应写在“ ”内。,Page 4,6.1 概述,函数概述 2函数声明 函数声明的作用是通知编译系统被调函数的有关信息(函数类型、名称、参数类型及数量),以便函数调用时,编译系统能够正确识别该函数,确保函数调用正确进行。 3函数调用 函数定义确定了函数能够完成的功能。但要真正实现函数的功能,必须通过函数调用来完成。,Page 5,6.1 概
3、述,C程序结构 语言源程序是由函数组成的,函数是程序的基本组成单位,每一个语言程序至少有一个且只能有一个主函数main( ),以及若干其它函数。C语言函数之间是平行关系。函数定义相互独立,互不从属。 main( )函数是执行程序的入口函数,程序运行时,总是从main( )函数开始执行,由main( )调用其他函数,其他函数间也可以互相调用。最后返回main( )函数,在main( )中结束程序的运行。 C语言程序中,main( )函数可以调用其他函数,但其他函数不能调用main( )函数。通常把调用其他函数的函数称为主调函数,被其他函数调用的函数称为被调函数。因此main( )函数只能是主调函
4、数,其他函数即可以是主调函数也可以是被调函数。,Page 6,6.1 概述,函数分类 1从用户角度分类 从用户角度,函数可分为库函数和用户自定义函数。 库函数是由编译系统提供,用户可直接使用而无须定义的函数。C语言把一些常用功能预先编写为函数,放在函数库中。 用户自定义函数是由用户根据自己的需要编写的具有独立功能的函数。,Page 7,6.1 概述,函数分类 2从函数参数角度分类 从函数参数角度,函数可分为有参函数和无参函数。 有参函数是函数定义中包含形式参数的函数。 无参函数是函数定义中不包含形式参数的函数。,Page 8,6.1 概述,函数分类 3从函数返回值角度分类 从函数返回值角度,函
5、数可分为有值函数和无值函数。 有值函数在完成函数功能后会向主调函数返回一个执行结果,执行结果称为函数返回值。 无值函数在完成函数功能后不会向主调函数返回执行结果,这类函数类似于其它语言的过程。由于无值函数无返回值,用户定义此类函数时应指定函数类型为“无值型”或“空类型”,说明符为“void”。,Page 9,6.2 函数的定义,函数定义的一般形式 函数定义的一般形式为: 类型说明符 函数名(带类型说明的形式参数表列) 数据描述部份 算法实现部份 函数定义包含函数说明部分和函数体。,Page 10,6.2 函数的定义,函数定义的一般形式 函数说明部分“类型说明符 函数名(带类型说明的形式参数表列
6、)”称为函数头,又称为函数原型,是函数进行交互的接口。函数名是用户标识符,用来唯一标识一个函数。带类型说明的形式参数表列说明了函数形参的类型及形参变量名,用逗号分开。类型说明符定义函数的类型,函数类型是函数返回值的类型,可以是基本数据类型,也可以是结构体类型、指针类型等。 中的内容称为函数体。函数体是对函数功能的定义,完成函数功能所用到的算法的具体实现。函数体包括两部份内容: 数据描述部份,定义函数中用到的变量; 算法实现部份,实现函数的功能。算法实现中即可使用函数的形参变量,也可使用函数体中定义的变量。,Page 11,6.2 函数的定义,函数定义的一般形式 中的内容称为函数体。函数体是对函
7、数功能的定义,完成函数功能所用到的算法的具体实现。函数体包括两部份内容: 数据描述部份,定义函数中用到的变量; 算法实现部份,实现函数的功能。算法实现中即可使用函数的形参变量,也可使用函数体中定义的变量。,Page 12,6.2 函数的定义,函数定义的一般形式 1有值函数的定义 有值函数需要给主调函数一个返回值,使用return语句实现。 return语句的一般用法为: return表达式; 或 return(表达式); return语句的功能是计算表达式的值,并把表达式的值返回给主调函数。,Page 13,6.2 函数的定义,函数定义的一般形式 2无值函数的定义 无值函数无须给主调函数返回值
8、,用户定义此类函数时应指定函数类型为“void”。无值函数的函数体中可以省略return语句,若有return语句,则return后面表达式必须为空。,Page 14,6.2 函数的定义,关于函数定义的几点说明 (1)函数名是标识符,不能与程序中的其他标识符同名。 (2)一个C语言程序可以包含多个函数,但函数定义相互独立,互不从属。一个函数的定义不能包含在另一个函数内部。 (3)无参函数定义时函数名之后的括号不能省略,无参函数定义时函数名后的括号内也可以写void。 (4)有参函数定义时,形参表列是带有类型说明的形参表列,每个形参都必须独立声明类型。 (5)函数值的类型由函数原型中的函数类型来
9、确定。return语句中,“表达式”值的类型应和函数类型一致,如果两者不一致,则以函数类型为准,自动把“表达式”值转换为函数返回值的类型。,Page 15,6.2 函数的定义,关于函数定义的几点说明 (6)有值函数使用return语句时,应保证函数体所有分支都应该给主调函数一个返回值。 (7)如果函数定义中未说明函数类型,则函数类型自动定义为整型。建议定义函数时,对所有函数都要指定函数类型。 (8)有值函数只能返回一个值。如果需要得到多个返回值,就要用到指针的概念。,Page 16,6.2 函数的定义,关于函数定义的几点说明 (9)C语言的函数定义有新旧两个标准,为了便于读者理解用旧标准编写的
10、程序,以下简单介绍函数定义的旧标准。旧标准中函数定义的一般形式为: 新、旧标准的区别在于,旧标准中函数名后面括号中只有形参名称,没有形参类型。形参类型说明放在形式参数声明部分。,Page 17,6.3 函数的调用,函数声明 定义一个函数,仅仅说明该函数是存在的,要调用该函数,还必须声明该函数的原型。被定义且声明了的函数才可以被调用。 函数声明的作用是通知编译系统被调函数的类型、名称、形式参数类型及数量,以便编译系统能够正确识别被调用的函数,并根据函数原型检查函数调用是否合法,与函数原型不匹配的函数被调用会导致编译错误。,Page 18,6.3 函数的调用,函数声明 1库函数的声明 库函数的声明
11、使用文件包含命令实现,一般形式为: #include include是特定字,其含义是将头文件包含在程序文件中。文件包含起作用的范围是从声明开始到程序文件结束,一般书写在程序开头。每一类库函数原型的声明都包含在相应的头文件中,包含了头文件就实现了对该类库函数的声明。如包含头文件stdio.h,程序中就可以调用输入/输出函数;包含了math.h,程序中就可以调用数学库函数。,Page 19,6.3 函数的调用,函数声明 2自定义函数的声明 自定义函数声明的一般形式为: 类型说明符 被调函数名(形参的类型表列); 或: 类型说明符 被调函数名(带类型说明的形参表列); 函数声明与函数定义中函数头的
12、格式基本一致,其中函数类型、形参数量和形参类型等必须完全相同,但函数声明末尾有分号。,Page 20,6.3 函数的调用,函数声明 2自定义函数的声明 函数声明有3种方式: (1)内部声明 在主调函数内声明被调函数,称为内部声明,又称局部声明。内部声明应放在主调函数中的数据描述部分。 (2)外部声明 在函数外声明被调函数,称为外部声明,又称全局声明。外部声明之后的所有函数都可以是该函数的主调函数。 (3)缺省声明 当被调函数定义在主调函数之前,可以不声明。,Page 21,6.3 函数的调用,函数声明 2自定义函数的声明 关于函数声明的几点说明: 函数声明与函数定义完全不同。函数定义是对函数功
13、能的完整定义,包括函数类型、名称、形式参数、函数体等,是一个完整、独立的函数单位。函数声明只是把函数类型、名称、形参数量和类型通知编译系统,以便程序调用该函数时,检查函数名称、类型是否正确,实参与形参是否匹配等,而不关心函数的功能。 如果被调函数的类型是整型或字符型,可以不对被调函数进行声明而直接调用。这时系统将自动对被调函数的返回值按整型处理。,Page 22,6.3 函数的调用,函数调用 1函数调用的一般形式 函数调用的一般形式为: 函数名(实际参数表列) 函数调用时括号中的参数称为实际参数,简称实参,各实参之间用逗号分开。实参必须是常量、变量或表达式等具有确定值的量。 函数调用时,实参与
14、形参数量应相同,类型要匹配,并且按顺序一一对应。,Page 23,6.3 函数的调用,函数调用 2函数调用的3种方式 (1)将有值函数调用参与表达式构成语句。 (2)有值函数调用作为另一个函数调用的实际参数。把该函数的返回值作为实参再传给另一函数。 (3)函数调用语句。函数调用加上分号构成函数调用语句。该方式不要求函数有返回值。,Page 24,6.3 函数的调用,函数调用 3函数调用时实参的求值顺序 函数调用时,如果实际参数表列中有多个实参,实参按照自右向左顺序求值。,Page 25,6.3 函数的调用,函数调用的执行机制 函数调用的实质是程序执行控制权的转移。 从函数调用过程来看,实参数据
15、向形参变量的传递是“单向值传递”。函数调用时将实参的值自左向右传递给形参,函数调用结束时并没有将形参的值反向传递给实参。注意函数形参得到值的顺序是自左向右的,而实参的求值顺序是自右向左的。 从输出结果来看,被调函数执行过程中,形参的值发生改变时,实参的值不会变化。,Page 26,6.4 函数的嵌套调用和递归调用,函数的嵌套调用 语言不允许函数嵌套定义。函数定义必须互相独立,互不包含,一个函数的定义不能包含在另一个函数内部。但是语言允许函数嵌套调用。即在被调函数的函数体中可以调用其他函数,并且函数调用可以根据需要多层嵌套。,Page 27,6.4 函数的嵌套调用和递归调用,函数的递归调用 函数
16、的递归调用是一种特殊的嵌套调用。一个函数在它的函数体内直接或间接地调用自身称为函数的递归调用。一个函数直接调用自身,称为直接递归调用,这样的函数称为递归函数。函数A( )调用了函数B( ),函数B( )又调用了函数A( ),称之为间接递归调用。程序设计中常用的是直接递归调用。 语言允许函数递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用递归函数自身。,Page 28,6.5 变量的作用域与生存期,变量的属性 变量的属性包括操作属性和存储属性。 变量类型决定了变量的取值范围、占用存储单元数量等操作属性。变量的存储属性决定了变量的作用域和变量的生存期。变量的作用域指变量的作用范围,按照变量的作用域可把变量分为全局变量和局部变量。变量生存期指变量存在时间,按照变量生存期可把变量分为动态存储方式和静态存储方式。,Page 29,6.5 变量的作用域与生存期,变量的属性 静态存