第八章函数 本章内容 1函数的定义形式 2函数的参数和函数的值 3函数调用、函数的嵌套调用以及函数的递归调用 4数组作为函数参数 5变量的作用域 6变量的存储类别 7内部函数和外部函数
1 第八章 函 数 本章内容: 1.函数的定义形式 2.函数的参数和函数的值 3.函数调用、函数的嵌套调用以及函数的递归调用 4.数组作为函数参数 5.变量的作用域 6.变量的存储类别 7.内部函数和外部函数
概述 ■C源程序是由函数组成的。虽然在前面的程序中都只有 个主函数main(,但实用程序往往由多个函数组成。 ■函数是C源程序的基本模块,通过对函数模块的调用实现 特定的功能。可以说C程序的全部工作都是由各式各样的函 数完成的,所以也把C语言称为函数式语言。 ■C语言不仅提供了极为丰富的库函数(如 Turbo C提供了三 百多个库函数),还允许用户建立自己定义的函数。 ■用户可把自己的算法编成一个个相对独立的函数模块,然 后用调用的方法来使用函数
2 C源程序是由函数组成的。 虽然在前面的程序中都只有一 个主函数main(),但实用程序往往由多个函数组成。 函数是C源程序的基本模块,通过对函数模块的调用实现 特定的功能。可以说C程序的全部工作都是由各式各样的函 数完成的,所以也把C语言称为函数式语言。 C语言不仅提供了极为丰富的库函数(如Turbo C提供了三 百多个库函数),还允许用户建立自己定义的函数。 用户可把自己的算法编成一个个相对独立的函数模块,然 后用调用的方法来使用函数。 概 述
函数的分类 1.从函数定义的角度看,函数可分为库函数和用户定义函数 (1)库函数 由C系统提供,用户无须定义,也不必在程序中作类型说 明,只需在程序前包含有该函数原型的头文件即可在程序中 直接调用。 在前面各章的例题中反复用到 printf、 scanf、 getchar putchar、gets、puts、 strcat等函数均属此类。 (2)用户定义函数 由用户按需要写的函数。对于用户自定义函数,不仅要 在程序中定义函数本身,而且在主调函数模块中还必须对该 被调函数进行类型说明,然后才能使用
3 函数的分类 (1) 库函数 由C系统提供,用户无须定义,也不必在程序中作类型说 明,只需在程序前包含有该函数原型的头文件即可在程序中 直接调用。 在前面各章的例题中反复用到printf 、 scanf 、 getchar 、 putchar、gets、puts、strcat等函数均属此类。 (2) 用户定义函数 由用户按需要写的函数。对于用户自定义函数,不仅要 在程序中定义函数本身,而且在主调函数模块中还必须对该 被调函数进行类型说明,然后才能使用。 1. 从函数定义的角度看,函数可分为库函数和用户定义函数
2.C语言的函数兼有其它语言中的函数和过程两种功能,从 这个角度看,又可把函数分为有返回值函数和无返回值函数 1)有返回值函数 此类函数被调用执行完后将向调用者返回一个执行结果, 称为函数返回值。如数学函数即属于此类函数。 由用户定义的这种要返回函数值的函数,必须在函数定 义和函数说明中明确返回值的类型。 (2)无返回值函数 此类函数用于完成某项特定的处理任务,执行完成后不 向调用者返回函数值。这类函数类似于其它语言的过程。 由于函数无须返回值,用户在定义此类函数时可指定它 的返回为“空类型”,空类型的说明符为“void〃
4 (1) 有返回值函数 此类函数被调用执行完后将向调用者返回一个执行结果, 称为函数返回值。如数学函数即属于此类函数。 由用户定义的这种要返回函数值的函数,必须在函数定 义和函数说明中明确返回值的类型。 (2) 无返回值函数 此类函数用于完成某项特定的处理任务,执行完成后不 向调用者返回函数值。这类函数类似于其它语言的过程。 由于函数无须返回值,用户在定义此类函数时可指定它 的返回为“空类型” , 空类型的说明符为“void” 。 2. C语言的函数兼有其它语言中的函数和过程两种功能,从 这个角度看,又可把函数分为有返回值函数和无返回值函数
3.从主调函数和被调函数之间数据传送的角度看可分为无参 函数和有参函数两种 (1)无参函数 ■函数定义、函数说明及函数调用中均不带参数 主调函数和被调函数之间不进行参数传送。 ■此类函数通常用来完成一组指定的功能,可以返回或不 返回函数值。 (2)有参函数(带参函数) ■在函数定义及说明时都有参数,称为形式参数(形参)。 ■在函数调用时也必须给出参数,称为实际参数(实参) ■进行函数调用时,主调函数将把实参的值传送给形参, 供被调函数使用
5 (1) 无参函数 函数定义、函数说明及函数调用中均不带参数。 主调函数和被调函数之间不进行参数传送。 此类函数通常用来完成一组指定的功能,可以返回或不 返回函数值。 (2) 有参函数(带参函数) 在函数定义及说明时都有参数,称为形式参数(形参)。 在函数调用时也必须给出参数,称为实际参数(实参)。 进行函数调用时,主调函数将把实参的值传送给形参, 供被调函数使用。 3. 从主调函数和被调函数之间数据传送的角度看可分为无参 函数和有参函数两种
说明: 1、在C语言中所有的函数定义,包括主函数main在内,都是 平行的。也就是说,在一个函数的函数体内,不能再定义另 个函数,即不能嵌套定义 函数之间允许相互调用,也允许嵌套调用。把调用者称为 主调函数。函数还可以自己调用自己,称为递归调用。 3、一个C源程序必须有,也只能有一个主函数main。 4、main函数是主函数,它可以调用其它函数,而不允许被 其它函数调用。 5、C程序的执行总是从main函数开始,完成对其它函数的 调用后再返回到main函数,最后由main函数结束整个程序
6 1、在C语言中所有的函数定义,包括主函数main在内,都是 平行的。也就是说,在一个函数的函数体内,不能再定义另 一个函数,即不能嵌套定义。 2、函数之间允许相互调用,也允许嵌套调用。把调用者称为 主调函数。函数还可以自己调用自己,称为递归调用。 3、一个C源程序必须有,也只能有一个主函数main。 4、main 函数是主函数,它可以调用其它函数,而不允许被 其它函数调用。 5、C程序的执行总是从main函数开始, 完成对其它函数的 调用后再返回到main函数,最后由main函数结束整个程序。 说 明:
函数定义的一般形式 1无参函数的一般形式 类型说明符函数名() 函数头 类型说明 语句 函数体 ■类型说明符指明了本函数的类型,函数的类型实际上是函 数返回值的类型 ■函数名是由用户定义的标识符,函数名后有一个空括号, 其中无参数,但括号不可少 ■{}中的内容称为函数体
7 函数定义的一般形式 类型说明符指明了本函数的类型,函数的类型实际上是函 数返回值的类型。 函数名是由用户定义的标识符,函数名后有一个空括号, 其中无参数,但括号不可少。 { } 中的内容称为函数体。 函数头 函数体 1.无参函数的一般形式 类型说明符 函数名( ) { 类型说明 语句 }
说明: ■在函数体中的类型说明,是对函数体内部所用到的变量的 类型说明 很多情况下都不要求无参函数有返回值,此时函数类型符 可以写为void 例如:定义一个函数: void Helloo printf("Hello, C System \n") 这里,Hll作为函数名,本函数是一个无参函数,当被 其它函数调用时,输出Hel, C System字符串
8 例如:定义一个函数: void Hello() { printf ("Hello,C System \n"); } 这里,Hello作为函数名,本函数是一个无参函数,当被 其它函数调用时,输出Hello,C System字符串。 在函数体中的类型说明,是对函数体内部所用到的变量的 类型说明。 很多情况下都不要求无参函数有返回值,此时函数类型符 可以写为void。 说 明:
2有参函数的一般形式 类型说明符函数名(形式参数表列) 类型说明 语句 ■有参函数比无参函数多了两个内容,其一是形式参数表, 其二是形式参数类型说明。 ■在形参表中给出的参数称为形式参数,它们可以是各种类 型的变量,各参数之间用逗号间隔。 ■在进行函数调用时,主调函数将赋予这些形式参数实际的 值。形参既然是变量,当然必须给以类型说明
9 有参函数比无参函数多了两个内容,其一是形式参数表, 其二是形式参数类型说明。 在形参表中给出的参数称为形式参数,它们可以是各种类 型的变量,各参数之间用逗号间隔。 在进行函数调用时,主调函数将赋予这些形式参数实际的 值。 形参既然是变量,当然必须给以类型说明。 2.有参函数的一般形式 类型说明符函数名(形式参数表列) { 类型说明 语句 }
例如,定义一个函数,用于求两个数中的大数,可写为: int max(a, b) int a, b; 传统格式 d int z; if (a>b)a; int max(int a, int b) else zb: i int z; return(z); 现代格式 if(a>b)za; else zbs return( Z );
10 例如,定义一个函数, 用于求两个数中的大数,可写为: int max(int a, int b) { int z; if (a>b) z=a; else z=b; return ( z ); } 现代格式 int max(a,b) int a,b; { int z; if (a>b) z=a; else z=b; return ( z ); } 传统格式