C语言课件教学-第8章-函数-.ppt

上传人(卖家):晟晟文业 文档编号:4688066 上传时间:2023-01-01 格式:PPT 页数:95 大小:240.34KB
下载 相关 举报
C语言课件教学-第8章-函数-.ppt_第1页
第1页 / 共95页
C语言课件教学-第8章-函数-.ppt_第2页
第2页 / 共95页
C语言课件教学-第8章-函数-.ppt_第3页
第3页 / 共95页
C语言课件教学-第8章-函数-.ppt_第4页
第4页 / 共95页
C语言课件教学-第8章-函数-.ppt_第5页
第5页 / 共95页
点击查看更多>>
资源描述

1、第第8章章 函函 数数8.1 概述 C语言是通过函数来实现语言是通过函数来实现模块化程序设计模块化程序设计的。的。一个较大的程序应分为若干程序模块,每个模块一个较大的程序应分为若干程序模块,每个模块实现一个特定的功能,这个模块称为实现一个特定的功能,这个模块称为子程序。子程序。C的子程序是通过的子程序是通过函数函数实现的,函数是实现的,函数是C语言程序语言程序的的基本单位基本单位。函数的构成 源程序是由函数组成的。函数是源程序的基源程序是由函数组成的。函数是源程序的基本模块,通过对函数模块的调用实现特定的功本模块,通过对函数模块的调用实现特定的功 能。能。实用程序往往包括一实用程序往往包括一个

2、主函数个主函数main()和和 若干其他若干其他函数函数。其中主函数。其中主函数main()是是必须必须的,它是所有函的,它是所有函数的数的执行起点执行起点。由。由主函数调用其它函数主函数调用其它函数,其它函,其它函数也可以数也可以互相调用互相调用,同一函数可以被,同一函数可以被一个或多个一个或多个函数调用任意多次。调用示意图如下:函数调用任意多次。调用示意图如下:程序的全部工作都是由各式各样的函数完成的,所以也把语言称为函数式语言。f11()f11()f31()f1()f11();f2()f11();f22();main()f1();f2();程序开发中使用函数的优点1 1)使用函数可以控制

3、)使用函数可以控制任务的规模任务的规模2 2)使用函数可以)使用函数可以控制变量的作用范围控制变量的作用范围3 3)使用函数,程序的开发可以由)使用函数,程序的开发可以由多人分工协作多人分工协作 4 4)使用函数,可以)使用函数,可以重新利用重新利用已有的、调式好的、已有的、调式好的、成熟的程序模块成熟的程序模块 5)函数模块函数模块相对独立,功能单一相对独立,功能单一,可混合编写也,可混合编写也 可独立编写调试。可独立编写调试。函数的一些说明1)一个)一个C程序由多个程序模块组成,每个模块作为一个程序由多个程序模块组成,每个模块作为一个源源程序文件,程序文件,多个源程序文件组成一个多个源程序

4、文件组成一个C程序,这样程序,这样便于便于分分别编写分别编译,提高调试效率,一个源程序文件可为别编写分别编译,提高调试效率,一个源程序文件可为多个多个C程序程序共用共用。2)一个源程序文件由)一个源程序文件由一个或多个函数一个或多个函数及其相关内容(如数及其相关内容(如数据定义等)组成,一个源程序文件是一个据定义等)组成,一个源程序文件是一个基本的编译单基本的编译单位。位。3)C程序的执行从主函数程序的执行从主函数main()开始(称为()开始(称为主调函数主调函数),),可以调用其它函数(称为可以调用其它函数(称为被调用函数被调用函数),调用流程),调用流程返回返回main(),最后函数在(

5、),最后函数在main()中()中结束结束。4)所有函数都是)所有函数都是平行平行的,在定义时候是的,在定义时候是分别进行分别进行的,相互的,相互独立独立,无从属无从属关系,关系,不可嵌套不可嵌套定义。函数间可相互调用,定义。函数间可相互调用,但但不能调用主函数不能调用主函数,主函数只能由系统调用。,主函数只能由系统调用。函数的分类1.从用户使用的角度从用户使用的角度 1)标准函数()标准函数(库函数库函数),由系统提供,用户不),由系统提供,用户不必自定义可直接使用,注意:不同必自定义可直接使用,注意:不同C编译系统提编译系统提供的库函数可能有些不同供的库函数可能有些不同 2)用户)用户自定

6、义自定义函数,用来解决用户专门需要。函数,用来解决用户专门需要。2.从函数的形式从函数的形式 1)无参函数无参函数。在调用函数时,。在调用函数时,main不不向被调用向被调用函数传递数据,只用来执行一组操作。函数传递数据,只用来执行一组操作。2)有参函数,主调函数在调用被调用函数时,有参函数,主调函数在调用被调用函数时,通过参数向其通过参数向其传递数据传递数据,一般情况下,执行被调,一般情况下,执行被调用函数时,得到用函数时,得到一个函数值一个函数值,供主调函数使用。,供主调函数使用。函数应当先定义,后调用函数应当先定义,后调用(1)无参函数的一般形式无参函数的一般形式 函数类型函数类型 函数

7、名函数名()说明语句部分;说明语句部分;可执行语句部分;可执行语句部分;无参函数一般不需要返回函数值,函数类型无参函数一般不需要返回函数值,函数类型void类型类型(空类型)(空类型)2)有参函数的一般形式)有参函数的一般形式 函数类型函数类型 函数名函数名(形参表列形参表列)说明语句部分;说明语句部分;可执行语句部分;可执行语句部分;例:例:int max(x,y)int x,y;/形式参数说明形式参数说明 /int z;/函数体中的说明部分函数体中的说明部分 /z=xy?x:y;return(z);这两行可以写成一行:这两行可以写成一行:int max(int x,int y)3“空函数空

8、函数”类型说明符类型说明符 函数名函数名()“空函数空函数”什么操作也不做什么操作也不做。其作用是在此处。其作用是在此处留留一函数的位置一函数的位置,以便将来扩充功能之用。函数名,以便将来扩充功能之用。函数名也在将来换取实际的函数名。也在将来换取实际的函数名。函数定义的一些说明1.函数头(首部):说明了函数类型、函数名称及函数头(首部):说明了函数类型、函数名称及参数。参数。(1)函数类型:)函数类型:函数返回值的数据类型,可以是函数返回值的数据类型,可以是基本数据类型也可以是构造类型。如果省略默认基本数据类型也可以是构造类型。如果省略默认为为int,如果不返回值,定义为,如果不返回值,定义为

9、void类型。类型。(2)函数名:)函数名:给函数取的名字,以后用这个名字给函数取的名字,以后用这个名字调用。函数名由用户命名,命名规则同标识符。调用。函数名由用户命名,命名规则同标识符。(3)(3)函数名后面是参数表,无参函数没有参数传函数名后面是参数表,无参函数没有参数传递,但递,但“()()”号不能省略,这是格式的规定。号不能省略,这是格式的规定。参数表说明参数的类型和形式参数的名称,各个参数表说明参数的类型和形式参数的名称,各个形式参数用形式参数用“,”分隔。分隔。2.函数体:函数体:函数首部下用一对函数首部下用一对括起来的部括起来的部分。如果函数体内有多个分。如果函数体内有多个,最外

10、层最外层是函是函数体的范围。数体的范围。函数体一般包括声明部分、执行部分两部函数体一般包括声明部分、执行部分两部分。分。1)声明部分:)声明部分:在这部分定义本函数所使用在这部分定义本函数所使用的变量和进行有关声明(如函数声明)。的变量和进行有关声明(如函数声明)。2)执行部分:执行部分:程序段,由若干条语句组成程序段,由若干条语句组成(可以在其中调用其它函数)。(可以在其中调用其它函数)。例:输入三个整数,求三个整数中的最大值例:输入三个整数,求三个整数中的最大值不使用函数不使用函数(除除mainmain外外)main()main()intint n1,n2,n3,nmax;n1,n2,n3

11、,nmax;scanf(“%d%d%d”,&n1,&n2,&n3);scanf(“%d%d%d”,&n1,&n2,&n3);if(n1n2)if(n1n2)nmaxnmax=n1;=n1;else else nmaxnmax=n2;=n2;if(n3max)if(n3max)max=n3;max=n3;printf(“maxprintf(“max=%=%dndn”,nmaxnmax););使用函数使用函数int max(int,int,int);/*函数声明函数声明*/main()int n1,n2,n3,nmax;scanf(“%d%d%d”,&n1,&n2,&n3);nmax=max(n1

12、,n2,n3);printf(“max=%dn“,nmax);int max(int x,int y,int z)int m;if(xy)m=x;else m=y;if(zm)m=z;return m;像调用库函数像调用库函数一样调用一样调用函数定义函数定义8.3 函数参数和函数的值函数参数和函数的值8.3.1 形式参数与实际参数形式参数与实际参数 在调用函数时,大多情况下,主调与被调函在调用函数时,大多情况下,主调与被调函数间有数间有数据传递关系数据传递关系,这就是有参函数。在定义,这就是有参函数。在定义函数时,函数名后面括号中的变量名称为函数时,函数名后面括号中的变量名称为“形形式式参参数

13、数”,在主调函数中调用一个函数时,函数名,在主调函数中调用一个函数时,函数名后面括号中的参数(可以是表达式)称为后面括号中的参数(可以是表达式)称为“实实际际参参数数”。发生函数调用时,调用函数把发生函数调用时,调用函数把实参的值实参的值复制复制一份,一份,传送给传送给被调用函数的被调用函数的形参形参,从而实现调用,从而实现调用函数向被调用函数的函数向被调用函数的数据传送数据传送。例例 从键盘输入两个数,输出其中较大的一个。从键盘输入两个数,输出其中较大的一个。main()int a,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);/a,b为实际参数为实际参数 /pri

14、ntf(“Max is%d”,c);max(x,y)/x,y为形式参数为形式参数 /int x,y;int z;z=xy?x:y;return(z);说明:说明:1)形参变量在被调用前形参变量在被调用前不占用存储单元不占用存储单元;在被调用结束;在被调用结束 后,后,形参所占存储单元亦被形参所占存储单元亦被释放释放。因此,因此,形参只有在该函数形参只有在该函数内有效。内有效。调用结束,返回调用函数后,则不能再使用该调用结束,返回调用函数后,则不能再使用该形参变量。形参变量。2)实参可以是常量、变量、表达式、函数等。无论实参是)实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行

15、函数调用时,它们何种类型的量,在进行函数调用时,它们都必须具有确都必须具有确定的值,定的值,以便把这些值传送给形参。因此,应预先用赋以便把这些值传送给形参。因此,应预先用赋值、输入等办法,值、输入等办法,使实参获得确定的使实参获得确定的值。值。3)实参对形参的)实参对形参的数据传送是单向数据传送是单向的,即只能把实参的值传的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。送给形参,而不能把形参的值反向地传送给实参。4)实参和形参)实参和形参占用不同的内存单元占用不同的内存单元,即使同名也互不影响,即使同名也互不影响5)在被定义函数中,必须指定形参的类型。)在被定义函数中,必须指

16、定形参的类型。实参和形参的实参和形参的类型应相同或赋值相容。类型应相同或赋值相容。main()int a=3,b=5;void swap(int,int);swap(a,b);printf(“a=%d,b=%dn”,a,b);void swap(int x,int y)int temp;temp=x;x=y;y=temp;printf(“x=%d,y=%d n”,x,y);是按值传递的 按址传递放在指针里面讲。传递值35ab35xy 3tempMain()函数:调用Swap函数8.3.2 函数的返回值 通常,希望通过函数调用使通常,希望通过函数调用使主调函数主调函数得到一得到一个确定的值,这就

17、是函数的个确定的值,这就是函数的返回值。返回值。说明如下:说明如下:1)函数的返回值是通过)函数的返回值是通过return语句语句获得的。当不获得的。当不需返回函数值时,可省去需返回函数值时,可省去return语句。语句。2)return语句的后面可以语句的后面可以有括号,也可以没有。有括号,也可以没有。如:如:return z;return(z);3)return语句的后面可以是变量,也可以是表达语句的后面可以是变量,也可以是表达式。式。如:如:return(x y?x:y);4)return语句返回值的类型应与该函数的语句返回值的类型应与该函数的类型类型一一 致。致。否否 则以函数类型为准

18、。则以函数类型为准。5)若函数中)若函数中没有没有return语句语句,则该函数被调用,则该函数被调用后也会后也会带带 回不确定的值回不确定的值。为了明确表示不需要。为了明确表示不需要函数返回值,可函数返回值,可 以用以用“void”定义函数为定义函数为“无无类型类型”。凡不需要返回值的函数,一般均定义为。凡不需要返回值的函数,一般均定义为“void”类型。类型。6)一个函数可以)一个函数可以有一个以上有一个以上的的return语句,执行语句,执行到哪个到哪个return语句,哪个语句,哪个return语句起作用。语句起作用。8.4 函数的调用 在程序中,是通过对函数的调用来执行函数体的,其过

19、程在程序中,是通过对函数的调用来执行函数体的,其过程与其它语言的子程序调用相似。与其它语言的子程序调用相似。语言中,函数调用的一般形式为:语言中,函数调用的一般形式为:函数名函数名(实际参数表实际参数表)说明:说明:1)对于无参函数,尽管没有)对于无参函数,尽管没有“实参表实参表”,但也,但也不得省略不得省略括括号。号。2)“实参表实参表”中的参数之间用中的参数之间用逗号逗号分开。分开。3)实参与形参之间的个数及类型必须)实参与形参之间的个数及类型必须一一对应。一一对应。4)对实参求值的顺序是自左至右还是自右至左)对实参求值的顺序是自左至右还是自右至左,视具体的视具体的系统而定。系统而定。Tu

20、rbo C 和和 MS C 是按是按自右至左自右至左的顺序求值。的顺序求值。见见P162 例例8.48.4.2 函数调用的方式按照函数在程序中出现的位置,可以有以下三种调用方式:1)函数语句:C语言中的函数可以只进行某些操作而不返回语言中的函数可以只进行某些操作而不返回函数值,这时的函数调用可作为一条独立的语句。如函数值,这时的函数调用可作为一条独立的语句。如 printf(“C pragram”)gets(s););2)函数表达式:函数作为表达式的一项,出现在表达式中,函数作为表达式的一项,出现在表达式中,以以函数返回值参与表达式的运算函数返回值参与表达式的运算。这种方式要求函数是。这种方式

21、要求函数是有有返回值返回值的。如:的。如:c=2 max(a,b);3)函数参数:函数作为另一个函数调用的函数作为另一个函数调用的实际参数实际参数出现。出现。这种情况是把该函数的返回值作为实参进行传送,因此要这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须求该函数必须是有返回值是有返回值的。如:的。如:m=max(max(a,b),c);8.4.3 对被调用函数的声明和函数原型对被调用函数的声明对被调用函数的声明在一个函数被另一个函数调用时,须具备以下条在一个函数被另一个函数调用时,须具备以下条件:件:1)被调用的函数已存在)被调用的函数已存在2)如果被调函数为库函数,则应在文件

22、开头)如果被调函数为库函数,则应在文件开头 用用“#include”命令命令声明声明相应的相应的“头文头文 件件”。如:。如:#include“stdio.h”#include“math.h”3)如果被调函数为如果被调函数为自定义函数自定义函数且其且其定义在主调函定义在主调函数定义之后数定义之后,则应在主调函数中说明其类型(即,则应在主调函数中说明其类型(即对被调用函数进行声明)。对被调用函数进行声明)。函数声明的作用是把函数名、函数参数的个数函数声明的作用是把函数名、函数参数的个数和参数类型等信息和参数类型等信息通知编译系统通知编译系统,以便在调用时,以便在调用时,编译系统能正确识别函数并检

23、查调用编译系统能正确识别函数并检查调用是否合法是否合法。函。函数声明又称函数原型。格式如下:数声明又称函数原型。格式如下:函数类型函数类型 函数名(参数类型函数名(参数类型1,参数类型,参数类型2,参数类型参数类型n);函数类型函数类型 函数名(参数类型函数名(参数类型1,参数名,参数名1,参数类,参数类型型2,参数名,参数名2,参数类型,参数类型n,参数名,参数名n);如果不声明,系统无法在调用时对函数调用的如果不声明,系统无法在调用时对函数调用的正确性进行检查,容易出错。正确性进行检查,容易出错。注意注意:函数的定义和声明:函数的定义和声明不是一回事不是一回事。定义是。定义是对函数功能的对

24、函数功能的确立确立,包括指定函数名、函数值类型、形参及其类型、,包括指定函数名、函数值类型、形参及其类型、函数体等,它是一个完整的、独立的的函数体等,它是一个完整的、独立的的函数单位函数单位。而函。而函数的声明则是把函数的名字、函数类型以及形参的类型、数的声明则是把函数的名字、函数类型以及形参的类型、个数和顺序等个数和顺序等通知编译系统通知编译系统以便在调用时进行以便在调用时进行对照检查对照检查。如:main()double new_style(int,double);/*函数声明*/Double new_style(int a,double x)/*函数定义*/说明:1)类型标识符类型标识符

25、 被调函数名被调函数名();这种声明形这种声明形式也是合法的,但不提倡。式也是合法的,但不提倡。2)如果被调函数为自定义函数且其定义)如果被调函数为自定义函数且其定义在主调函数定义之前,则在主调函数中可在主调函数定义之前,则在主调函数中可不必说明其类型。因为编译程序已知道其不必说明其类型。因为编译程序已知道其类型。类型。3)如果被调函数的值是)如果被调函数的值是整型或字符型整型或字符型,可可不必声明类型不必声明类型,系统自动按整型说明。,系统自动按整型说明。4)如果在)如果在所有被调函数定义之前、在文件所有被调函数定义之前、在文件的开头、在函数的外部的开头、在函数的外部已对被调函数作了已对被调

26、函数作了类型说明,则在各主调函数中可不必说明类型说明,则在各主调函数中可不必说明其类型。见其类型。见P166例。例。char letter();float f();int i();main()一开始就将所有要被一开始就将所有要被调用的函数作出声明调用的函数作出声明/主调函数中不必说明它所调用的函数的类型主调函数中不必说明它所调用的函数的类型 /8.5 函数的嵌套调用 函数函数不允许不允许嵌套定义,但是嵌套定义,但是允许允许嵌套调用。函数的嵌套嵌套调用。函数的嵌套调用是指,在执行被调用函数时,调用是指,在执行被调用函数时,被调用函数又调用了被调用函数又调用了其它函数其它函数。这与其它语言的子程序

27、嵌套调用的情形是类。这与其它语言的子程序嵌套调用的情形是类似的,其关系可表示如下图:似的,其关系可表示如下图:例:用弦截法求方程的根。x35x2+16x80=0(1)取两个不同点x1、x2,如果f(x1)和f(x2)符号相反,则(x1,x2)区间内必有一个根。如果f(x1)与f(x2)同符号,则应改变x1、x2,直到f(x1)、f(x2)异号为止。注意x1、x2的值不应差太大,以保证(x1,x2)区间只有一根。方法如下:(2)连接f(x1)和f(x2)两点,此线(即弦)交x轴于x.x点坐标可用下式求出:)()()()(121221xfxfxfxxfxx再从x求出f(x)。xyxf(x1)f(x

28、)x1x2f(x2)3)若f(x)与f(x1)同符号,则根必在(x,x2)区间内,此时将x作为新的x1。如果f(x)与f(x2)同符号,则表示根在(x1,x2)区间内,将x作为新的x2.4)重复步骤(2)和(3),直到|f(x)|为止,为一个很小的数,例如106。此时认为f(x)0.输入x1、x2,求f(x1)、f(x2)直到f(x1)与f(x2)异号求f(x1)与f(x2)连线与x轴的交点xy=f(x),y=f(x1)y与y1同号x1=xy1=yx2=xy2=y直到|f(x)|0)/*f(x)与f(x1)同符号。*/y1=y;x1=x;else x2=x;while(fabs(y)=0.00

29、01);return(x);main()/*主函数*/float x1,x2,f1,f2,x;do printf(input x1,x2:n);scanf(%f,%f,&x1,&x2);f1=f(x1);f2=f(x2);while(f1*f2=0);x=root(x1,x2);printf(A root of equation is%8.4f,x);运行情况如下:input x1,x2:2,6A root of equation is 5.0008.6 函数的递归调用 在调用一个函数的过程中在调用一个函数的过程中又出现直接或间又出现直接或间接地调用接地调用该函数该函数本身本身,称为函数的递归

30、调,称为函数的递归调用。用。C语言的特点之一就在于允许函数的递语言的特点之一就在于允许函数的递归调用。归调用。直接调用 int f(x)int x;int y,z;z=f(y);间接调用 int f1(x)int x;int y,z;z=f2(y);int f2(t)int t;int a,b;a=f1(y);显然:上述例子会无限递归(无限执行)。所以,在递归调用时都有条件限制。即:条件成立,调用递归,否则结束。例例8.7 有有5人排成一队,从最后一人开始,其年龄均比人排成一队,从最后一人开始,其年龄均比 前面的人大前面的人大2岁,而最前面的人年龄是岁,而最前面的人年龄是10岁岁,问问 最后一

31、人的年龄是多少岁?最后一人的年龄是多少岁?main()age(5)age(4)+2age(n)n=5age(3)+2age(n)n=4age(2)+2age(n)n=3age(1)+2age(n)n=2age(1)age(n)n=1age(1)=10age(2)=12age(3)=14age(4)=16age(5)=18输出输出age(5)age(n)int n;int c;if(n=1)c=10;else c=age(n1)+2;return(c);main()printf(“%dn”,age(5);运行结果运行结果:18例例8.8 用递归方法求用递归方法求n!1.从数学上定义从数学上定义n

32、!=1 (n=0,1)n(n1)!(n1)2.程序程序 float fac(n)int n;float f;if(n%cn,getone,putone);void hanoi(n,one,two,three)/*将n个盘从one借助two,移动three*/char one,two,three;int n;if(n=1)move(one,three);else hanoi(n1,one,three,two);move(one,three);hanoi(n1,two,one,three);main()int m;printf(input the number of disdes :);scanf

33、(%d,&m);printf(The step to moving%3d disdes:n,m);hanoi(m,A,B,C);运行情况如下:input the number of disdes:3 The step to moving 3 diskes:A C A B C B A C B A B C A C两个函数:move(getone,putone)表示从getone 塔移一个盘子至putone塔 hanoi(n,one,two,three)表示n个盘子从one塔借助于two塔(空)移至three塔。调用时塔用字符常量A,B,C 表示。8.7 8.7 数组作为函数参数数组作为函数参数分为

34、两种情况:1.数组元素作为实参2.数组名同时为形、实参一、数组元素作为实参 由于数组元素与相同类型的简单变量地位完全一样;因此,数组元素作函数参数也和简单变量一样,也是值的单向传递例:设有两个同样大小的一维数组,a10,b10将相应元素比较,统计a中大于b中对应元素的个数,小于的个数,相等时的个数。程序如下:main()int lange(int x,int y)int a10,b10,i,n=0,m=0,k=0;printf(enter array a:n);for(i=0;i10;I+)scanf(5,d,&ai);printf(n);printf(enter array b:n);for

35、(i=0;i10;i+)scanf(%d,&bi);printf(n);for(i=0;ibi%d timesnai=bi%d timesnaik)printf(array a is larger than array bn);else if(ny)flag=1;else if(xy)flag=1;else flag=0;return(flag);运行情况如下:enter array a:1 3 5 7 9 8 6 4 2 0enter array b:5 3 8 9 1 3 5 6 0 4 aibi 4 times ai=bi 1 times aibi 5 times array a is

36、smaller than array b二、数组名作实、形参特点:直接用数组名作参数时,则为地址传送(不是值传送),即实参数组的首地址传递给形参数组首地址。所以,实参、形参数组共享相同的内存单元。1.形参数组可不指定大小,也可用另一参数作大小,以确定使用实数组的元素个数。2.形参、实参数组必须类型一致。3.多维数组方式一样,仅第一维大小的说明可省略例1.有一个一维数组score,内放10个学生成绩,求平均成绩。程序如下:float average(array)float array10;int i;float aver,sum=array 0;for(i=1;i10;i+)sum=sum+ar

37、rayi;aver=sum/10;return(aver);main()float score 10,aver;int i;printf(input 10 score:n);for(i=0;i10;i+)scanf(%f,&scorei);printf(n);aver=average(score);printf(average score is%5.2f,aver);运行情况如下:input 10 scores:100 56 78 98.5 76 87 99 67.5 75 97 average score is 83.40程序2.float average(array,n)int n;flo

38、at array;int i;float aver,sum=array0;for(i=1;in;i+)sum=sum+arrayi;aver=sun/n;return(aver);main()static float score_15=98.5,97,91.5,60,55static float score _2 10=67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5printf(“the average of class A is%6.2fn”,average(score_1,5);printf(“the average of class B is%6.2f

39、n”,average(score_2,10);运行结果如下:the average of class A is 80.40 the average of class B is 78.20 8.8.1 局部变量局部变量 概念:概念:是指在一定范围内有效的变量是指在一定范围内有效的变量。C语言中,在以下各位置定义的变量均属语言中,在以下各位置定义的变量均属于局部变量。于局部变量。在函数体内定义的变量,在函数体内定义的变量,在本函数范围在本函数范围内有效,作用域局限于函数体内。内有效,作用域局限于函数体内。在复合语句内定义的变量在复合语句内定义的变量,在本复合语,在本复合语句范围内有效,作用域局限于

40、复合语句句范围内有效,作用域局限于复合语句内。内。有参函数的形式参数有参函数的形式参数也是局部变量,只也是局部变量,只在其所在的函数范围内有效。在其所在的函数范围内有效。关于局部变量的作用域还要说明以下几点:关于局部变量的作用域还要说明以下几点:1主函数主函数main()中定义的内部变量,中定义的内部变量,也也只能在主函数中使用只能在主函数中使用,其它函数不能使用。,其它函数不能使用。同时,主函数中也不能使用其它函数中定义同时,主函数中也不能使用其它函数中定义的内部变量。因为主函数也是一个函数,与的内部变量。因为主函数也是一个函数,与其它函数是平行关系。这一点是与其它语言其它函数是平行关系。这

41、一点是与其它语言不同的,应予以注意。不同的,应予以注意。2允许在不同的函数中使用相同的变量允许在不同的函数中使用相同的变量名,名,它们代表不同的对象,分配不同的单元,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。互不干扰,也不会发生混淆。例如:例如:int f1(int a)/*函数函数f1*/int b,c;/*a,b,c作用域:仅限于函数作用域:仅限于函数f1()中中*/int f2(int x)/*函数函数f2*/int y,z;/*x,y,z作用域:仅限于函数作用域:仅限于函数f2()中中.x,y,z换为换为a,b,c也也可以可以*/main()int m,n;/*m,

42、n作用域:仅限于函数作用域:仅限于函数main()中中*/8.8.2 全局变量全局变量 全局变量:全局变量:在函数之外在函数之外定义的变量。定义的变量。(所有(所有函数前,函数前,各个函数各个函数之间,所有函之间,所有函数后数后)全局变量全局变量作用域:作用域:从定义全局变量的位从定义全局变量的位置起到本源程序结束为止。置起到本源程序结束为止。全局变量可被作用域内的所有函数直接全局变量可被作用域内的所有函数直接引用。引用。在函数fun()中,虽然没有定义变量a,b,但由于它们定义在程序的最前面,是全程变量,凡是在定义该变量的后面定义的函数均可以引用它们。#include “stdio.h”in

43、t a=3,b=5;/*在函数体外定义的变量*/Main()void fun();printf(“a=%d,b=%d n”,a,b);fun();printf(“a=%d,b=%d n”,a,b);void fun(void)int c;c=a;a=b;b=c;说明:1.全局变量增加了函数间数据全局变量增加了函数间数据联系的渠道联系的渠道。由于同一文件中的所。由于同一文件中的所 有函数都能引用全局变量的值,当需要从一个函数中有函数都能引用全局变量的值,当需要从一个函数中带回多个带回多个 值值时,就能克服函数调用只能返回一个值的局限性。不成文约时,就能克服函数调用只能返回一个值的局限性。不成文约

44、 定:全局变量名定:全局变量名首字母大写首字母大写。见。见P185例例8.152.如无必要如无必要,不要使用全局变量。因为全局变量既,不要使用全局变量。因为全局变量既降低程序的清降低程序的清 晰性和函数的通用性晰性和函数的通用性,且又在程序的全部执行过程中都且又在程序的全部执行过程中都占用存占用存 储空间。储空间。3.在文件开头定义的外部变量才可在整个文件范围内使用,若在在文件开头定义的外部变量才可在整个文件范围内使用,若在 定义点之前的函数需引用外部变量,则可用定义点之前的函数需引用外部变量,则可用关键字关键字“extern”作作 “外部变量说明外部变量说明”。注意:注意:外部变量定义和外部

45、变量说明并不是同一回事。外部变量外部变量定义和外部变量说明并不是同一回事。外部变量的的定义只能有一次定义只能有一次,它的位置在所有函数之外。而同一程序中的外它的位置在所有函数之外。而同一程序中的外部部变量说明可以有多次变量说明可以有多次,它的位置在函数之内,它的位置在函数之内(哪个函数要用就在哪个函数要用就在哪个函数中说明哪个函数中说明)。系统。系统根据根据外部变量的外部变量的定义定义(而不是根据外部变量而不是根据外部变量的说明的说明)分配存储单元分配存储单元。对外部变量的初始化只能在。对外部变量的初始化只能在“定义定义”时进行时进行,“extern”只是申明该变量是一个已在外部定义过的变量而

46、已。只是申明该变量是一个已在外部定义过的变量而已。4.如果在同一源文件中,外部变量与局部变量如果在同一源文件中,外部变量与局部变量同名同名,则在局部变,则在局部变 量的作用范围内,量的作用范围内,外部变量不起作用外部变量不起作用。“屏蔽作用屏蔽作用”。见。见P187例例 8.16外部变量的定义与说明。外部变量的定义与说明。int vs(int xl,int xw)extern int xh;/*外部变量外部变量xh的说明的说明*/int v;v=xl*xw*xh;/*直接使用外部变量直接使用外部变量xh的值的值*/return v;main()extern int xw,xh;/*外部变量的说

47、明外部变量的说明*/int xl=5;/*内部变量的定义内部变量的定义*/printf(xl=%d,xw=%d,xh=%dnv=%d,xl,xw,xh,vs(xl,xw);int xl=3,xw=4,xh=5;/*外部变量外部变量xl、xw、xh的定义的定义*/程序区静态存储区动态存储区数据,变量存放内存分配 变量的存储方式变量的存储方式 变量从变量从空间空间上分为局部变量、全局变量。上分为局部变量、全局变量。从变量从变量存在的时间存在的时间的长短(即变量生存期)来的长短(即变量生存期)来划分,变量还可以分为:划分,变量还可以分为:动态存储变量、静态动态存储变量、静态存储变量。存储变量。变量的

48、存储方式决定了变量的生存变量的存储方式决定了变量的生存期。期。如果全局变量如果全局变量用用static修饰,修饰,并不是说是静并不是说是静态的,而是说,态的,而是说,只对本模块有只对本模块有效。效。自动(局部变量)自动(局部变量)(auto)动态存储方式动态存储方式 寄存器(局部变量)寄存器(局部变量)(register)存储方式存储方式 静态(局部变量)(静态(局部变量)(static)静态存储方式静态存储方式 静态全局变量静态全局变量(全局变量全部是静态全局变量全部是静态 的,不必用的,不必用static修饰修饰)静态存储变量:存放于静态存储区,在程序整个运行过程中,始终占据固定的内存单元

49、。动态存储变量:存放于动态存储区,根据程序的运行状态(如:函数调用)而临时分配的单元,且单元并不固定。8.9.2 auto变量变量 auto型存储方式是型存储方式是C语言语言默认的局部变量的存储方式默认的局部变量的存储方式,也是局部,也是局部变量变量最常使用最常使用的存储方式。的存储方式。自动变量属于局部变量的范畴,作用域限于定义它的函数或复合自动变量属于局部变量的范畴,作用域限于定义它的函数或复合语句内。语句内。自动变量所在的函数或复合语句执行时,系统动态为相应的自动自动变量所在的函数或复合语句执行时,系统动态为相应的自动变量分配存储单元,当自动变量所在的函数或复合语句执行结束变量分配存储单

50、元,当自动变量所在的函数或复合语句执行结束后,自动变量失效,它所在的存储单元被系统释放,所以原来的后,自动变量失效,它所在的存储单元被系统释放,所以原来的自动变量的值不能保留下来。若对同一函数再次调用时,系统会自动变量的值不能保留下来。若对同一函数再次调用时,系统会对相应的自动变量重新分配存储单元。对相应的自动变量重新分配存储单元。定义格式定义格式:auto 类型说明类型说明 变量名;变量名;auto为自动存储类别关键词,为自动存储类别关键词,可以省略,缺省时系统默认可以省略,缺省时系统默认auto.8.9.3 用用static声明局部变量声明局部变量 静态局部变量的定义格式静态局部变量的定义

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(C语言课件教学-第8章-函数-.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|