




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第8章函数章函数主要内容:主要内容:1,函数的定义的普通方式,函数的定义的普通方式2,函数参数和函数值,函数参数和函数值3,函数的普通调用、嵌套调用和递归调用,函数的普通调用、嵌套调用和递归调用4,数组作为函数参数,数组作为函数参数5,部分变量和全局变量,部分变量和全局变量6,变量的存储类别,变量的存储类别7,内部函数和外部函数,内部函数和外部函数1 1,掌握函数的定义方式,调用格式,前往值,掌握函数的定义方式,调用格式,前往值,值传送与地址传送的区别;值传送与地址传送的区别; 2 2,掌握变量的作用域,存在范围,存储类,掌握变量的作用域,存在范围,存储类别别 要求一个较大型的程序普通均分成
2、多个模块,每个模块完成一个特定的功能。在C言语中用函数来实现模块。一个C程序可由一个main函数和假设干个其他函数构成。由主函数调用其他函数,其他函数之间也可相互调用,甚至可以调用函数本人递归调用,但不能调用主函数。程序开发人员常用的方法是将一些经常运用的功能编写成函数,放在公共函数库中。 C C言语程序的构造如下图。在每个程序中,主函数言语程序的构造如下图。在每个程序中,主函数mainmain是是必需的,它是一切程序的执行起点,必需的,它是一切程序的执行起点,mainmain函数只调用其它函数只调用其它函数,不能为其它函数调用。其它函数没有主从关系,可函数,不能为其它函数调用。其它函数没有主
3、从关系,可以相互调用。一切函数都可以调用库函数。程序的总体功以相互调用。一切函数都可以调用库函数。程序的总体功能经过函数的调用来实现。能经过函数的调用来实现。f11( )f11( )f31( )f1( )f11( );f2( )f11( );f22( );main( )f1( );f2( );参见书中参见书中P155页例页例8.1 了解了解C程序经过函数调用实现所需功能程序经过函数调用实现所需功能例例8.1函数调用的简单例子函数调用的简单例子#includevoid main() void printstar(); void print_message(); printstar(); prin
4、t_message(); printstar();void printstar()printf(*n);void print_message()printf( How do you do!n); 阐明:阐明:1,一个,一个C程序由一个或多个程序模块组成。程序由一个或多个程序模块组成。每一个程序模块作为一个源程序文件。每一个程序模块作为一个源程序文件。2,一个源程序文件由一个或多个函数组成,一个源程序文件由一个或多个函数组成,编译是以源程序为单位;编译是以源程序为单位;3,程序的执行是由主函数开场到主函数终了,程序的执行是由主函数开场到主函数终了,其它函数是经过函数调用来实现的。其它函数是经过函
5、数调用来实现的。4,一切函数都是平行的。即函数定义不能嵌,一切函数都是平行的。即函数定义不能嵌套,即函数内不能定义函数,但函数之间可套,即函数内不能定义函数,但函数之间可以相互调用,甚至可以调用该函数本身递以相互调用,甚至可以调用该函数本身递归调用但不能调用主函数归调用但不能调用主函数5,从用户的角度函数分为:规范函数即库,从用户的角度函数分为:规范函数即库函数和用户定义函数。函数和用户定义函数。6,从函数的方式看,函数分为无参函数和有,从函数的方式看,函数分为无参函数和有参函数参函数8.2.1无参函数定义的普通方式无参函数定义的普通方式 函数类型函数类型 函数名函数名( void ) 变量声
6、明部分;变量声明部分; 可执行语句部分;可执行语句部分; 当函数类型为当函数类型为int型时可以省略。型时可以省略。8.2.2. 有参函数定义的普通方式有参函数定义的普通方式函数类型函数类型 函数名函数名( 数据类型数据类型 参数参数,数据类型,数据类型 参数参数2 ) 阐明语句部分;阐明语句部分; 可执行语句部分;可执行语句部分; 有参函数比无参函数多了一个参数表。调用有有参函数比无参函数多了一个参数表。调用有参函数时,调用函数将赋予这些参数实践的值。参函数时,调用函数将赋予这些参数实践的值。为了与调用函数提供的实践参数区别,将函数为了与调用函数提供的实践参数区别,将函数定义中的参数表称为方
7、式参数表,简称形参表。定义中的参数表称为方式参数表,简称形参表。例定义一个函数用以前往两个数中的大者例定义一个函数用以前往两个数中的大者int max(int x, int y)int z;/*声明部分*/z=xy?x:y;return(z);函数类型函数名参数类型方式参数执行部分函数的前往值8.2.3空函数空函数它的方式为:它的方式为:类型阐明符函数名类型阐明符函数名() 对形参声明的传统方式对形参声明的传统方式int max(x, y)int max(x, y)int x, y;int x, y;return xy?x:y;return xy?x:y;函数定义举例:函数定义举例:输入三个整
8、数,求三个整数中的最大值输入三个整数,求三个整数中的最大值不运用函数不运用函数(除除main外外)#includevoid main() int n1,n2,n3, max; scanf(%d%d%d,&n1,&n2,&n3); if(n1n2) max=n1; else max=n2; if(n3max) max=n3; printf(max=%dn,max); 运用函数运用函数#includevoid main() int n1,n2,n3,nmax; int max(int,int,int); scanf(%d%d%d,&n1,&n2,&n
9、3); nmax=max(n1,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表达式参数和实践参数表达式参数和实践参数函数的参数分为形参和实参两种,作用是实现函数的参数分为形参和实参两种,作用是实现数据传送。数据传送。形参出如今函数定义中,只能在该函数体内运形参出如今函数定义中,只能在该函数体内运用。发生函数调用时,调用函
10、数把实参的值复用。发生函数调用时,调用函数把实参的值复制制1份,传送给被调用函数的形参,从而实现份,传送给被调用函数的形参,从而实现调用函数向被调用函数的数据传送。调用函数向被调用函数的数据传送。 例例8.2调用函数时的数据传送调用函数时的数据传送#includevoid main()int a,b,c,max(int,int);scanf(%d%d,&a,&b);c=max(a,b);printf(Max is %d,c);int max(int x, int y)int z;z=xy?x:y;return(z);阐明:阐明:1形参变量只需在被调用时,才分配内存单元;调用终了
11、时,即刻释形参变量只需在被调用时,才分配内存单元;调用终了时,即刻释放放所分配的内存单元。因此,形参只需在该函数内有效。调用终了,前往调所分配的内存单元。因此,形参只需在该函数内有效。调用终了,前往调用函数后,那么不能再运用该形参变量。用函数后,那么不能再运用该形参变量。2实参可以是常量、变量、表达式、函数等。无论实参是何种类型的实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,量,在进展函数调用时,它们都必需具有确定的值,以便把这些值传送给形参在进展函数调用时,它们都必需具有确定的值,以便把这些值传送给形参因此,应预先用赋值、输入等方法,使实参获得确定的值。因此,应预先用赋值、输
12、入等方法,使实参获得确定的值。3在被定义的函数中,每个形参都必需指定其类型。在被定义的函数中,每个形参都必需指定其类型。4实参和形参必需赋值兼容。实参和形参必需赋值兼容。5实参对形参的数据传送是单向的,即只能把实参的值传送给形参,实参对形参的数据传送是单向的,即只能把实参的值传送给形参,而而不能把形参的值反向地传送给实参。不能把形参的值反向地传送给实参。8.3.2函数的前往值函数的前往值1,函数的前往是经过,函数的前往是经过return语句,格式为:语句,格式为:return(表达式;或表达式;或 return 表达式;表达式;表达式的值即为函数前往的值。当程序执行表达式的值即为函数前往的值。
13、当程序执行return时会将流程转移到被调函数。时会将流程转移到被调函数。2,前往值的类型:为函数的类型函数名前,前往值的类型:为函数的类型函数名前的类型,当表达式的类型与函数类型不一的类型,当表达式的类型与函数类型不一样时系统会自动转换成函数类型。样时系统会自动转换成函数类型。3,没有,没有return语句时系统将前往一个不确定语句时系统将前往一个不确定的值。的值。4,假设不需求前往数据,那么可将函数类型,假设不需求前往数据,那么可将函数类型声明为空类型声明为空类型(void)例例8.3前往值类型与函数类型不同前往值类型与函数类型不同#includevoid main()int a,b,c,
14、max(float,float);scanf(%d%d,&a,&b);c=max(a,b);printf(Max is %d,c);int max(float x, float y)return xy?x:y;例例8.4:实参求值顺序:实参求值顺序#includevoid main()void f(int,int);int i=2;f(i,+i);f(+i,i);void f(int a,int b)printf(ta=%dtb=%dn,a,b);8.4函数调用函数调用8.4.1函数调用的普通方式:函数调用的普通方式:函数名实参表列函数名实参表列阐明:阐明:1,其中实参表列中的
15、实参个数应和形,其中实参表列中的实参个数应和形参个数一样,且对应位置上的实参与形参的参个数一样,且对应位置上的实参与形参的数据类型必需一样。数据类型必需一样。2,实参之间用逗号分隔。,实参之间用逗号分隔。3,对实参的求值是从右到左的顺序执行的。,对实参的求值是从右到左的顺序执行的。8.4.2函数调用的方式函数调用的方式函数调用可以是单独调用,或在表达式中,函数调用可以是单独调用,或在表达式中,或作为函数参数。或作为函数参数。如如printstar();c=2*max(a,b);m=max(a,max(b,c);8.4.3对被调用的声明和函数原型对被调用的声明和函数原型1对自定义函数。当函数定义
16、在函数调用对自定义函数。当函数定义在函数调用后面且函数类型不是后面且函数类型不是int型时必需在调用前对调型时必需在调用前对调用函数进展阐明,阐明格式为:用函数进展阐明,阐明格式为:函数类型函数名形参类型函数类型函数名形参类型1,形参类型,形参类型2,.);2对库函数,那么必需将包含该库的原型对库函数,那么必需将包含该库的原型声明的头文件包含到程序中:声明的头文件包含到程序中:#include例例8.5对被调函数的声明。对被调函数的声明。#includevoid main()float add(float,float); /*对被调函数的声明对被调函数的声明*/float a,b;scanf(
17、%f%f,&a,&b);printf(sun is %f,add(a,b);float add(float a, float b)return a+b;课堂练习习题习题8.3:写一个判素数的函数,在主函数中输入一个:写一个判素数的函数,在主函数中输入一个整数,输出能否素数的信息整数,输出能否素数的信息主函数:主函数:函数声明与变量声明函数声明与变量声明输入一个整数输入一个整数函数调用并根据前往值输出能否素数的信息函数调用并根据前往值输出能否素数的信息判别素数函数:判别素数函数:for i=2 to n/2 假设假设n能被某一整数整除那么前往能被某一整数整除那么前往0前往前往1#
18、includevoid main() int n,prime(int); printf(输入一个正整数输入一个正整数:n); scanf(%d,&n); if(prime(n) printf(%d是一个素数是一个素数n,n); else printf(%d不是一个素数不是一个素数n,n);int prime(int n) int i;for(i=2;i=n/2;i+) if(n%i=0) return 0;return 1;8.5函数的嵌套调用被调函数也可调用其它函数,构成调用的嵌被调函数也可调用其它函数,构成调用的嵌套,前往时必需一层层前往。套,前往时必需一层层前往。例:一个函数的嵌
19、套调用的例例:一个函数的嵌套调用的例#includevoid main() void f1(); printf(n调用函数调用函数f1之前之前:);f1();printf(n调用函数调用函数f1之后之后:);void f1()void f2();printf(n这是函数这是函数f1:);f2();void f2()printf( n这是函数这是函数f2:n);8.6函数的递归调用函数的递归调用函数的递归调用是指,一个函数在它的函数体内,直函数的递归调用是指,一个函数在它的函数体内,直接或间接地调用它本身。接或间接地调用它本身。言语允许函数的递归调用。在递归调用中,调用函言语允许函数的递归调用。
20、在递归调用中,调用函数又是被调用函数,执行递归函数将反复调用其本身。数又是被调用函数,执行递归函数将反复调用其本身。每调用一次就进入新的一层。每调用一次就进入新的一层。为了防止递归调用无终止地进展,必需在函数内有终为了防止递归调用无终止地进展,必需在函数内有终止递归调用的手段。常用的方法是加条件判别,满足止递归调用的手段。常用的方法是加条件判别,满足某种条件后就不再作递归调用,然后逐层前往。某种条件后就不再作递归调用,然后逐层前往。例例8.8用递归方法求用递归方法求n!。#includestdio.hfloat fac(int n) float f; if(n1) f=n*fac(n-1);
21、else f=1; return(f); void main()int n;float y;printf(input a integer number:);scanf(%d,&n);y=fac(n);printf(%d!=%15.0f,n,y);课堂练习课堂练习习题习题8.13:用递归方法求:用递归方法求n阶勒让德多项式的阶勒让德多项式的值值1/)() 1()() 12(101)(21nnxPnxxPnnxnxPnnn#includevoid main() float p(int,int); int x,n; printf(输入输入n和和x的值:的值:n); scanf(%d%d,&a
22、mp;n,&x); printf(np%d(%d)=%6.2f,n,x,p(n,x);float p(int n,int x)if(n=0) return 1;if(n=1) return x;if(n1) return (2*n-1)*x*p(n-1,x)-(n-1)*p(n-2,x)/n;8.7 数组作为函数参数数组作为函数参数数组作为函数参数的主要功能是将整个数组的数据传送给被数组作为函数参数的主要功能是将整个数组的数据传送给被调函数。调函数。8.7.1. 数组元素作为函数实参数组元素作为函数实参运用方法和变量作为函数参数一样,只须把数组元素看作变运用方法和变量作为函数参数一样,
23、只须把数组元素看作变量。量。此时实参为数组元素,形参为与数组一样类型的变量。此时实参为数组元素,形参为与数组一样类型的变量。例例8.108.10有两个数组有两个数组a,ba,b,比较其大小。,比较其大小。算法设计:算法设计:1 1,用,用2 2个个forfor循环语句输入数组元素循环语句输入数组元素2 2,for(i=0;i10;i+)for(i=0;ibiaibi的个数的个数/调用函数进展比较调用函数进展比较用用m m表示表示ai=biai=bi的个数的个数用用k k表示表示aibiaibi的个数的个数 3 3,输出结果,输出结果4 4,定义比较函数,定义比较函数#includevoid m
24、ain()int large(int,int);int a10,b10,i,n=0,m=0,k=0;printf(请输入数组请输入数组a的的10个数,用空格分隔个数,用空格分隔n);for(i=0;i10;i+) scanf(%d,&ai);printf(n请输入数组请输入数组b的的10个数,用空格分隔个数,用空格分隔n);for(i=0;i10;i+) scanf(%d,&bi);for(i=0;ik) printf(na比比b大大n);if(ny) return 1;if(xy) return -1;return 0;2. 2. 数组名作为函数参数数组名作为函数参数调用格式
25、:函数名调用格式:函数名( (数组名数组名函数定义格式:类型函数名函数定义格式:类型函数名( (数组类型数组名数组类型数组名 ) )阐明:阐明:1 1用数组名作函数参数,应该在调用函数用数组名作函数参数,应该在调用函数和被调用函数中分别定义数组,且数据类型必需一致,和被调用函数中分别定义数组,且数据类型必需一致,否那么结果将出错。否那么结果将出错。2 2C C编译系统对形参数组大小不作检查,所以形参编译系统对形参数组大小不作检查,所以形参数组可以不指定大小。数组可以不指定大小。3 3数组名作为函数参数采用的是地址传送方法,数组名作为函数参数采用的是地址传送方法,假设在函数中对形参数组作了改动,
26、前往后实参数组假设在函数中对形参数组作了改动,前往后实参数组也会作相应的改动。也会作相应的改动。例例8.11有一个一维数组有一个一维数组score,内放,内放10个学生个学生的成果,求平均成果的成果,求平均成果算法设计算法设计1 1,用,用forfor循环语句输入数组元素循环语句输入数组元素2 2,调用函数求平均值,调用函数求平均值3 3,输出平均值,输出平均值4 4,定义求平均值函数,定义求平均值函数4.14.1用用forfor循环语句求总成果循环语句求总成果4.24.2前往平均值前往平均值float average(float array)int i;float aver,sum=arra
27、y0;for(i=1;i10;i+) sum+=arrayi;aver=sum/10;return aver;main()float score10,aver; int i;printf(input 10 score:n);for(i=0;i10;i+) scanf(%f,&scorei);aver=average(score);printf(naverage score is %5.2f,aver);形参数组实参例例8.13 用选择法对数组的用选择法对数组的10个元素排序个元素排序算法设计算法设计S1用用for循环语句输入数组元素循环语句输入数组元素S2调用函数排序调用函数排序S3用
28、用for循环语句输出数组元素循环语句输出数组元素S4定义排序函数定义排序函数选择法排序的根本思想:选择法排序的根本思想:第第1轮:从轮:从a2到到an中选择最小的数与中选择最小的数与a1交换交换第第2轮:从轮:从a3到到an中选择最小的数与中选择最小的数与a2交换交换第第3轮:从轮:从a4到到an中选择最小的数与中选择最小的数与a3交换交换第第i轮:从轮:从ai+1到到an中选择最小的数与中选择最小的数与ai交换交换第第n-1轮:从轮:从an到到an中选择最小的数与中选择最小的数与an-1交换交换for(i=1;in;i+) for(j=i+1;j=n;j+)/从剩余的数中找最小的数的下标从剩
29、余的数中找最小的数的下标 找出找出aj中最小数的下标中最小数的下标k if(aiak)交换交换ai与与ak#includevoid main() int a11,i; printf(input 10 number:n); for(i=1;i=10;i+) scanf(%d,&ai); sort(a,10); printf(nthe sorted array:n); for(i=1;i11;i+) printf(%5d,ai);void sort(int array,int n) int i, j, k,t; for(i=1;in;i+) k=i; for(j=i+1; j=n; j+)
30、 if(arrayjarrayk t=arrayi; arrayi=arrayk; arrayk=t; /endfori/end sort8.7.3多维数组名作为函数参数多维数组名作为函数参数例:有一个例:有一个33的矩阵,求一切元素中的最大值。的矩阵,求一切元素中的最大值。#includevoid main( ) int max_value(int array34); int a34=1,3,5,7,2,4,6,8,15,17,34,12; printf(max value is %dn, max_value(a);int max_value(int array34) int i,j,max
31、; max=array00; for(i=0;i3;i+) for(j=0;jmax) max=arrayij; return max;8.8 部分变量和全局变量部分变量和全局变量 言语中一切的变量都有本人的作用域。变量阐明的位置不言语中一切的变量都有本人的作用域。变量阐明的位置不同,其作用域也不同,据此将言语中的变量分为内部变量和外同,其作用域也不同,据此将言语中的变量分为内部变量和外部变量。部变量。 在一个函数内部阐明的变量是内部变量,它只在该函数范围在一个函数内部阐明的变量是内部变量,它只在该函数范围内有效。内有效。也就是说,只需在包含变量阐明的函数内部,才干运用被阐也就是说,只需在包含
32、变量阐明的函数内部,才干运用被阐明的变量,在此函数之外就不能运用这些变量了。所以内部变量明的变量,在此函数之外就不能运用这些变量了。所以内部变量也称也称部分变量部分变量。例如:例如:int f1(int a) /*函数函数f1*/ int b,c; /*a,b,c作用域:仅限于函数作用域:仅限于函数f1()中中*/ int f2(int x) /*函数函数f2*/ int y,z; /*x,y,z作用域:仅限于函数作用域:仅限于函数f2()中中*/ main() int m,n; /*m,n作用域:仅限于函数作用域:仅限于函数main()中中*/关于部分变量的作用域还要阐明以下几点:关于部分变
33、量的作用域还要阐明以下几点:1主函数主函数main()中定义的内部变量,也只能在主函数中运用,中定义的内部变量,也只能在主函数中运用,其它函数不能运用。同时,主函数中也不能运用其它函数中定其它函数不能运用。同时,主函数中也不能运用其它函数中定义的内部变量。由于主函数也是一个函数,与其它函数是平行义的内部变量。由于主函数也是一个函数,与其它函数是平行关系。这一点是与其它言语不同的,应予以留意。关系。这一点是与其它言语不同的,应予以留意。2形参变量也是内部变量,属于被调用函数;实参变量,那形参变量也是内部变量,属于被调用函数;实参变量,那么是调用函数的内部变量。么是调用函数的内部变量。3允许在不同
34、的函数中运用一样的变量名,它们代表不同的允许在不同的函数中运用一样的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。对象,分配不同的单元,互不干扰,也不会发生混淆。4在复合语句中也可定义变量,其作用域只在复合语句范围在复合语句中也可定义变量,其作用域只在复合语句范围内。内。8.8.2 全局变量全局变量 在函数外部定义的变量称为外部变量。以此类推,在函数外部定义的变量称为外部变量。以此类推,在函数外部定义的数组就称为外部数组。在函数外部定义的数组就称为外部数组。外部变量不属于任何一个函数,其作用域是:从外部外部变量不属于任何一个函数,其作用域是:从外部变量的定义位置开场,到
35、本文件终了为止。变量的定义位置开场,到本文件终了为止。 外部变量可被作用域内的一切函数直接援用,所外部变量可被作用域内的一切函数直接援用,所以外部变量又称全局变量。以外部变量又称全局变量。int p=1, q=5; /*外部变量外部变量p,q*/float f1(int a)/*a, b, c为部分变量为部分变量*/int b, c;.char c1, c2;/*外部变量外部变量ch1, ch2*/char f2(int x,int y)int i, j;.main()int m, n;.p与q的作用范围c1与c2的作用范围对于全局变量还有以下几点阐明:对于全局变量还有以下几点阐明:1 1外部
36、变量可加强函数模块之间的数据联络,但又使这些函外部变量可加强函数模块之间的数据联络,但又使这些函数依赖这些外部变量,因此使得这些函数的独立性降低。数依赖这些外部变量,因此使得这些函数的独立性降低。从模块化程序设计的观念来看这是不利的,因此不是非用不可从模块化程序设计的观念来看这是不利的,因此不是非用不可时,不要运用外部变量。时,不要运用外部变量。2 2在同一源文件中,允许外部变量和内部变量同名。在内部在同一源文件中,允许外部变量和内部变量同名。在内部变量的作用域内,外部变量将被屏蔽而不起作用。变量的作用域内,外部变量将被屏蔽而不起作用。3 3外部变量的作用域是从定义点到本文件终了。假设定义点外
37、部变量的作用域是从定义点到本文件终了。假设定义点之前的函数需求援用这些外部变量时,需求在函数内对被援用之前的函数需求援用这些外部变量时,需求在函数内对被援用的外部变量进展阐明。外部变量阐明的普通方式为:的外部变量进展阐明。外部变量阐明的普通方式为:extern extern 数据类型数据类型 外部变量外部变量 ,外部变量,外部变量22; 留意:外部变量的定义和外部变量的阐明是两回事。外部变量留意:外部变量的定义和外部变量的阐明是两回事。外部变量的定义,必需在一切的函数之外,且只能定义一次。而外部变的定义,必需在一切的函数之外,且只能定义一次。而外部变量的阐明,出如今要运用该外部变量的函数内,而
38、且可以出现量的阐明,出如今要运用该外部变量的函数内,而且可以出现多次。多次。例例8.15有一个一维数组,内放有一个一维数组,内放10个学生的成果,写一个函数个学生的成果,写一个函数求出平均分,最高分和最低分。求出平均分,最高分和最低分。分析:函数只能前往一个值,现要前往三个值,可将其中两个分析:函数只能前往一个值,现要前往三个值,可将其中两个设为外部变量,如最高分和最低分。设为外部变量,如最高分和最低分。算法设计:算法设计:average函数:函数:1,定义变量,定义变量2,求出总分,最高分和最低分,求出总分,最高分和最低分3,前往平均分,前往平均分主函数:主函数:1,定义变量,数组,定义变量
39、,数组2,输入成果,输入成果3,函数调用,函数调用4,输出平均分最高分和最低分,输出平均分最高分和最低分float max=0,min=0;float average(float score ,int n)int i; float aver, sum=score0;max=min=score0;for(i=1;imax) max=scorei; if(scoreimin) min=scorei; aver=sum/n;return (aver);main()int i;float ave,score10;printf(input 10 numbern);for(i=0;i10;i+) scan
40、f(%f,&scorei);ave=average(score,10);printf( max=%6.2fn min=%6.2fnaverage=%6.2f,max,min,ave);getch();8.9变量的存储类别变量的存储类别8.9.18.9.1动态存储方式与静态存储方式动态存储方式与静态存储方式在言语中,对变量的存储类型阐明有以下四种:在言语中,对变量的存储类型阐明有以下四种:自动变量自动变量(auto)(auto)、存放器变量、存放器变量(register)(register)、外部变量、外部变量(extern)(extern)、静态变量、静态变量(static)(stat
41、ic)。 自动变量和存放器变量属于动态存储方式,外部变自动变量和存放器变量属于动态存储方式,外部变量和静态内部变量属于静态存储方式。量和静态内部变量属于静态存储方式。动态存储方式:运用时分配存储空间,运用完释放。动态存储方式:运用时分配存储空间,运用完释放。静态存储方式:程序开场执行时分配存储空间,程静态存储方式:程序开场执行时分配存储空间,程序终了时释放。序终了时释放。8.9.2auto变量自动变量变量自动变量1定义格式:定义格式:auto 数据类型数据类型 变量表;变量表;其中存储类型符其中存储类型符auto可以省略。可以省略。2存储特点存储特点1自动变量属于动态存储方式。在函数中定义的自
42、动变量,只自动变量属于动态存储方式。在函数中定义的自动变量,只在该函数内有效;函数被调用时分配存储空间,调用终了就释放。在该函数内有效;函数被调用时分配存储空间,调用终了就释放。在复合语句中定义的自动变量,只在该复合语句中有效;退出复在复合语句中定义的自动变量,只在该复合语句中有效;退出复合语句后,也不能再运用,否那么将引起错误。合语句后,也不能再运用,否那么将引起错误。2定义而不初始化,那么其值是不确定的。假设初始化,那么定义而不初始化,那么其值是不确定的。假设初始化,那么赋初值操作是在调用时进展的,且每次调用都要重新赋一次初值。赋初值操作是在调用时进展的,且每次调用都要重新赋一次初值。3由
43、于自动变量的作用域和生存期,都局限于定义它的个体内由于自动变量的作用域和生存期,都局限于定义它的个体内函数或复合语句,因此不同的个体中允许运用同名的变量而函数或复合语句,因此不同的个体中允许运用同名的变量而不会混淆。即使在函数内定义的自动变量,也可与该函数内部的不会混淆。即使在函数内定义的自动变量,也可与该函数内部的复合语句中定义的自动变量同名。复合语句中定义的自动变量同名。8.9.3用用static声明部分变量静态变量声明部分变量静态变量1定义格式:定义格式: static 数据类型数据类型 内部变量表;内部变量表;2存储特点存储特点1静态内部变量属于静态存储。在程序执行过程中,即使所在静态内部变量属于静态存储。在程序执行过程中,即使所在函数调用终了也不释放。换句话说,在程序执行期间,静态函数调用终了也不释放。换句话说,在程序执行期间,静态内部变量一直存在,但其它函数是不能援用它们的。内部变量一直存在,但其它函数是不能援用它们的。2定义但不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论