资源预览内容
第1页 / 共65页
第2页 / 共65页
第3页 / 共65页
第4页 / 共65页
第5页 / 共65页
第6页 / 共65页
第7页 / 共65页
第8页 / 共65页
第9页 / 共65页
第10页 / 共65页
亲,该文档总共65页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第7讲 函 数C语语言言是是通通过过函函数数来来实实现现模模块块化化程程序序设设计计的的。所所以以较较大大的的C语语言言应应用用程程序序,往往往往由由一一个个主主函函数数和和若若干干个个函函数数组组成成。由由主主函函数数调调用用其其它它函函数数,其其它它函函数数也也可可以以相相互互调调用用。同同一一个个函函数数可可以以被被一一个个或或多多个个函函数数调用任意多次。调用任意多次。7.1函数的定义与调用函数的定义与调用7.2函数的嵌套调用与递归调用函数的嵌套调用与递归调用7.3数组作为函数参数数组作为函数参数7.4内部变量与外部变量内部变量与外部变量7.5变量的动态存储与静态存储变量的动态存储与静态存储Return7.1函数的定义与调用函数的定义与调用7.1.1 7.1.1 函数的定义函数的定义7.1.2 7.1.2 函数的返回值与函数类型函数的返回值与函数类型7.1.3 7.1.3 对被调用函数的说明和函数原型对被调用函数的说明和函数原型7.1.4 7.1.4 函数的调用函数的调用7.1.5 7.1.5 函数的形参与实参函数的形参与实参 Return7.1.1函数的定义函数的定义1任任何何函函数数(包包括括主主函函数数main())都都是是由由函函数数说说明明和和函函数数体体两两部部分分组组成成。根根据据函函数数是是否否需需要要参参数数,可可将将函函数数分分为为无无参参函函数数和和有有参函数两种。参函数两种。(1)无参函数的一般形式)无参函数的一般形式函数类型函数类型函数名函数名(void)说明语句部分说明语句部分;可执行语句部分可执行语句部分;注注意意:在在旧旧标标准准中中,函函数数可可以以缺缺省省参参数数表表。但但在在新新标标准准中中,函函数数不不可可缺缺省省参参数数表表;如如果果不不需需要要参参数数,则则用用“void”表表示示,主主函函数数main()例外。例外。(2)有参函数的一般形式)有参函数的一般形式函数类型函数类型函数名函数名(数据类型数据类型参数参数,数据类型,数据类型参数参数2)说明语句部分说明语句部分;可执行语句部分可执行语句部分;有有参参函函数数比比无无参参函函数数多多了了一一个个参参数数表表。调调用用有有参参函函数数时时,调调用用函函数将赋予这些参数实际的值。数将赋予这些参数实际的值。为为了了与与调调用用函函数数提提供供的的实实际际参参数数区区别别开开,将将函函数数定定义义中中的的参参数数表表称为形式参数表,简称形参表。称为形式参数表,简称形参表。案例案例7.1定义一个函数,用于求两个数中的大数。定义一个函数,用于求两个数中的大数。/*案案例例代代码码文文件件名名:AL7_1.C功功能能:定定义义一一个个求求较较大大数数的的函函数数并并在在主主函函数中调用数中调用*/#includeintmax(intn1,intn2)/*定义一个函数定义一个函数max()*/intc;if(n1n2)c=n1;elsec=n2;returnc;main()intnum1,num2,nmax;printf(inputtwonumbers:n);scanf(%d%d,&num1,&num2);nmax=max(num1,num2);printf(max=%dn,nmax);return(n1n2?n1:n2);2说明说明(1)函数定义不允许嵌套。)函数定义不允许嵌套。在在语语言言中中,所所有有函函数数(包包括括主主函函数数main())都都是是平平行行的的。一一个个函函数数的的定定义义,可可以以放放在在程程序序中中的的任任意意位位置置,主主函函数数main()之之前前或或之之后后。但但在在一一个个函函数数的的函函数数体体内内,不不能能再再定定义义另另一一个个函函数数,即即不不能能嵌套定义。嵌套定义。(2)空空函函数数既既无无参参数数、函函数数体体又又为为空空的的函函数数。其其一一般般形形式式为:为:函数类型函数类型函数名函数名(void)Return7.1.2 函数的返回值与函数类型函数的返回值与函数类型语语言言的的函函数数兼兼有有其其它它语语言言中中的的函函数数和和过过程程两两种种功功能能,从从这这个个角度看,又可把函数分为有返回值函数和无返回值函数两种。角度看,又可把函数分为有返回值函数和无返回值函数两种。1函数返回值与函数返回值与return语句语句有参函数的返回值,是通过函数中的有参函数的返回值,是通过函数中的return语句来获得的。语句来获得的。(1)return语句的一般格式:语句的一般格式:return(返回值表达式返回值表达式);(2)return语语句句的的功功能能:返返回回调调用用函函数数,并并将将“返返回回值值表表达达式式”的值带给调用函数。的值带给调用函数。注注意意:调调用用函函数数中中无无return语语句句,并并不不是是不不返返回回一一个个值值,而而是是一一个个不不确确定定的的值值。为为了了明明确确表表示示不不返返回回值值,可可以以用用“void”定定义义成成“无(空)类型无(空)类型”。2函数类型函数类型在在定定义义函函数数时时,对对函函数数类类型型的的说说明明,应应与与return语语句句中中、返回值表达式的类型一致。返回值表达式的类型一致。如如果果不不一一致致,则则以以函函数数类类型型为为准准。如如果果缺缺省省函函数数类类型型,则则系统一律按整型处理。系统一律按整型处理。良良好好的的程程序序设设计计习习惯惯:为为了了使使程程序序具具有有良良好好的的可可读读性性并并减减少少出出错错,凡凡不不要要求求返返回回值值的的函函数数都都应应定定义义为为空空类类型型;即即使使函函数数类型为整型,也不使用系统的缺省处理。类型为整型,也不使用系统的缺省处理。Return7.1.3 对被调用函数的说明和函数原型对被调用函数的说明和函数原型在在ANSIC新新标标准准中中,采采用用函函数数原原型型方方式式,对对被被调调用用函函数数进进行行说说明明,其其一一般格式如下:般格式如下:函数类型函数类型 函数名函数名( (数据类型数据类型 参数名参数名, , 数据类型数据类型 参数名参数名2)2);语言同时又规定,在以下语言同时又规定,在以下2种情况下,可以省去对被调用函数的说明:种情况下,可以省去对被调用函数的说明:(1)当当被被调调用用函函数数的的函函数数定定义义出出现现在在调调用用函函数数之之前前时时。因因为为在在调调用用之之前前,编译系统已经知道了被调用函数的函数类型、参数个数、类型和顺序。编译系统已经知道了被调用函数的函数类型、参数个数、类型和顺序。(2)如如果果在在所所有有函函数数定定义义之之前前,在在函函数数外外部部(例例如如文文件件开开始始处处)预预先先对对各个函数进行了说明,则在调用函数中可缺省对被调用函数的说明。各个函数进行了说明,则在调用函数中可缺省对被调用函数的说明。Return7.1.4函数的调用函数的调用在在程程序序中中,是是通通过过对对函函数数的的调调用用来来执执行行函函数数体体的的,其其过过程程与与其其它它语语言的子程序调用相似。言的子程序调用相似。语言中,函数调用的一般形式为:语言中,函数调用的一般形式为:函数名函数名(实际参数表实际参数表)切切记记:实实参参的的个个数数、类类型型和和顺顺序序,应应该该与与被被调调用用函函数数所所要要求求的的参参数数个数、类型和顺序一致,才能正确地进行数据传递。个数、类型和顺序一致,才能正确地进行数据传递。在语言中,可以用以下几种方式调用函数:在语言中,可以用以下几种方式调用函数:(1)函函数数表表达达式式。函函数数作作为为表表达达式式的的一一项项,出出现现在在表表达达式式中中,以以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。函数返回值参与表达式的运算。这种方式要求函数是有返回值的。(2)函函数数语语句句。C语语言言中中的的函函数数可可以以只只进进行行某某些些操操作作而而不不返返回回函函数值,这时的函数调用可作为一条独立的语句。数值,这时的函数调用可作为一条独立的语句。(3)函函数数实实参参。函函数数作作为为另另一一个个函函数数调调用用的的实实际际参参数数出出现现。这这种种情情况况是是把把该该函函数数的的返返回回值值作作为为实实参参进进行行传传送送,因因此此要要求求该该函函数数必必须须是是有有返回值的。返回值的。7.1.5 函数的形参与实参函数的形参与实参函函数数的的参参数数分分为为形形参参和和实实参参两两种种,作作用用是是实实现现数数据据传送。传送。形参出现在函数定义中,只能在该函数体内使用。形参出现在函数定义中,只能在该函数体内使用。发生函数调用时,调用函数把实参的值复制发生函数调用时,调用函数把实参的值复制1份,传送给份,传送给被调用函数的形参,从而实现调用函数向被调用函数的被调用函数的形参,从而实现调用函数向被调用函数的数据传送。数据传送。案例案例7.3实参对形参的数据传递。实参对形参的数据传递。/*实参对形参的数据传递。实参对形参的数据传递。*/*案例代码文件名:案例代码文件名:AL7_3.C*/#includevoidmain()voids(intn);/*说明函数说明函数*/intn=100;/*定义实参定义实参n,并初始化并初始化*/s(n);/*调用函数调用函数*/printf(n_s=%dn,n);/*输输出出调调用用后后实实参参的的值值,便便于于进进行行比比较较*/voids(intn)inti;printf(n_x=%dn,n);/*输出改变前形参的值输出改变前形参的值*/for(i=n-1;i=1;i-)n=n+i;/*改变形参的值改变形参的值*/printf(n_x=%dn,n);/*输出改变后形参的值输出改变后形参的值*/程序演示说明:说明:(1)实实参参可可以以是是常常量量、变变量量、表表达达式式、函函数数等等。无无论论实实参参是是何何种种类类型型的的量量,在在进进行行函函数数调调用用时时,它它们们都都必必须须具具有有确确定定的的值值,以以便便把把这这些些值值传送给形参。传送给形参。因此,应预先用赋值、输入等办法,使实参获得确定的值。因此,应预先用赋值、输入等办法,使实参获得确定的值。(2)形形参参变变量量只只有有在在被被调调用用时时,才才分分配配内内存存单单元元;调调用用结结束束时时,即即刻释放所分配的内存单元。刻释放所分配的内存单元。因因此此,形形参参只只有有在在该该函函数数内内有有效效。调调用用结结束束,返返回回调调用用函函数数后后,则则不能再使用该形参变量。不能再使用该形参变量。(3)实实参参对对形形参参的的数数据据传传送送是是单单向向的的,即即只只能能把把实实参参的的值值传传送送给给形形参,而不能把形参的值反向地传送给实参。参,而不能把形参的值反向地传送给实参。(4)实参和形参占用不同的内存单元,即使同名也互不影响。)实参和形参占用不同的内存单元,即使同名也互不影响。Return7.2函数的嵌套调用和递归调用7.2.1函数的嵌套调用函数的嵌套调用函函数数的的嵌嵌套套调调用用是是指指,在在执执行行被被调调用用函函数数时时,被被调调用用函函数数又又调调用用了了其其它它函函数数。这这与与其其它它语语言言的的子子程程序序嵌嵌套套调调用用的的情情形形是是类类似似的的,其关系可表示如图其关系可表示如图7-1。案例案例7.4计算计算s=1k+2k+3k+Nk/*案例代码文件名:案例代码文件名:AL7_4.C功能:函数的嵌套调用功能:函数的嵌套调用*/#include#defineK4#defineN5longf1(intn,intk)/*计算计算n的的k次方次方*/longpower=n;inti;for(i=1;ik;i+)power*=n;returnpower;longf2(intn,intk)/*计算计算1到到n的的k次方之累加和次方之累加和*/longsum=0;inti;for(i=1;i=n;i+)sum+=f1(i,k);returnsum;main()printf(Sumof%dpowersofintegersfrom1to%d=,K,N);printf(%dn,f2(N,K);7.2.2 函数的递归调用函数的递归调用函数的递归调用是指,一个函数在它的函数体内,直接或间接函数的递归调用是指,一个函数在它的函数体内,直接或间接地调用它自身。地调用它自身。语语言言允允许许函函数数的的递递归归调调用用。在在递递归归调调用用中中,调调用用函函数数又又是是被被调调用用函函数数,执执行行递递归归函函数数将将反反复复调调用用其其自自身身。每每调调用用一一次次就就进进入入新新的一层。的一层。为为了了防防止止递递归归调调用用无无终终止止地地进进行行,必必须须在在函函数数内内有有终终止止递递归归调调用用的的手手段段。常常用用的的办办法法是是加加条条件件判判断断,满满足足某某种种条条件件后后就就不不再再作作递递归调用,然后逐层返回。归调用,然后逐层返回。理解理解“回推回推”和和“递推递推”过程。过程。案例案例7.5用递归法计算用递归法计算n!。/*功能:通过函数的递归调用计算阶乘功能:通过函数的递归调用计算阶乘*/#includelongpower(intn)longf;if(n1)f=power(n-1)*n;elsef=1;return(f);main()intn;longy;printf(inputainteagernumber:n);scanf(%d,&n);y=power(n);printf(%d!=%ldn,n,y);程序演示程序演示典型的古典问题典型的古典问题:Hanoi塔问题(课下理解)塔问题(课下理解)Return2007年年4月月1、在、在C语言中,函数返回值的类型最终取决于语言中,函数返回值的类型最终取决于()A)函数定义时在函数首部所说明的函数类型函数定义时在函数首部所说明的函数类型B)return语句中表达式值的类型语句中表达式值的类型C)调用函数时主函数所传递的实参类型调用函数时主函数所传递的实参类型D)函数定义时形参的类型函数定义时形参的类型2007年年9月月1、若函数调用时的实参为变量时,以下关于函数形参和实参的叙述、若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是中正确的是A)函数的实参和其对应的形参共占同一存储单元函数的实参和其对应的形参共占同一存储单元B)形参只是形式上的存在,不占用具体存储单元形参只是形式上的存在,不占用具体存储单元C)同名的实参和形参占同一存储单元同名的实参和形参占同一存储单元D)函数的形参和实参分别占用不同的存储单元函数的形参和实参分别占用不同的存储单元2008年年4月月1、有以下程序、有以下程序#includeintf(intx)inty;if(x=0|x=1)return(3);y=x*x-f(x-2);returny;main()intz;z=f(3);printf(%dn,z);程序的运行结果是程序的运行结果是A)0B)9C)6D)82008年年4月月2、以下程序的输出结果是、以下程序的输出结果是【13】。#includevoidfun(intx)if(x/20)fun(x/2);printf(%d,x);main()fun(3);printf(n);132008年年9月月1、下面的函数调用语句中、下面的函数调用语句中func函数的实参个数是函数的实参个数是func(f2(v1,v2),(v3,v4,v5),(v6,max(v7,v8);A)3B)4C)5D)82、有以下程序有以下程序#includeintfun(inta,intb)if(b=0)returna;elsereturn(fun(-a,-b);main()printf(%dn,fun(4,2);程序的运行结果是程序的运行结果是A)1B)2C)3D)42008年年9月月3、以下叙述中错误的是、以下叙述中错误的是A)用户定义的函数中可以没有用户定义的函数中可以没有return语句语句B)用户定义的函数中可以有多个用户定义的函数中可以有多个return语句,以便可以调用一次返回语句,以便可以调用一次返回多个函数值多个函数值C)用户定义的函数中若没有用户定义的函数中若没有return语句,则应当定义函数为语句,则应当定义函数为void类型类型D)函数的函数的return语句中可以没有表达式语句中可以没有表达式2009年年3月月1、有以下程序、有以下程序#includeintf(intx,inty)return(y-x)*x);main()inta=3,b=4,c=5,d;d=f(f(a,b),f(a,c);printf(%dn,d);程序运行后的输出结果是程序运行后的输出结果是A)10B)9C)8D)72009年年3月月2、有以下程序、有以下程序#includeintfun(intx,inty)if(x=y)return(x);elsereturn(x+y)/2);main()inta=4,b=5,c=6;printf(%dn,fun(2*a,fun(b,c);程序运行后的输出结果是程序运行后的输出结果是A)3B)6C)8D)122009年年9月月1、有以下程序、有以下程序#includevoidfun(intp)intd=2;p=d+;printf(%d,p);main()inta=1;fun(a);printf(%dn,a);程序运行后的输出结果是程序运行后的输出结果是A)32B)12C)21D)222009年年9月月2、有以下程序、有以下程序#includefun(intx)if(x/20)fun(x/2);printf(%d,x);main()fun(6);printf(n);程序运行后的输出结果是程序运行后的输出结果是【】136题盘练习题盘练习-注意函数类型、参数类型:注意函数类型、参数类型:1-2、7-1、22-2、77-2、78-2、93-2、97-2、98-2函数递归调用:函数递归调用:6-2(斐波拉契数列)、(斐波拉契数列)、27-2(迭代法)、(迭代法)、52-2、58-2(求阶乘)(求阶乘)嵌套调用:嵌套调用:21-2、43-2(二分法)、(二分法)、99-17.3数组作为函数参数数组作为函数参数数组用作函数参数有两种形式:一种是把数组元素数组用作函数参数有两种形式:一种是把数组元素(又称下标变量)作为实参使用;另一种是把数组名作(又称下标变量)作为实参使用;另一种是把数组名作为函数的形参和实参使用。为函数的形参和实参使用。7.3.1数组元素作为函数参数数组元素作为函数参数7.3.2数组名作为函数的形参和实参数组名作为函数的形参和实参Return7.3.1 数组元素作为函数参数数组元素作为函数参数数数组组元元素素就就是是下下标标变变量量,它它与与普普通通变变量量并并无无区区别别。数数组组元元素素只只能能用用作作函函数数实实参参,其其用用法法与与普普通通变变量量完完全全相相同同:在在发发生生函函数数调调用用时时,把数组元素的值传送给形参,实现单向值传送。把数组元素的值传送给形参,实现单向值传送。案例案例7.6写一函数,统计字符串中字母的个数。写一函数,统计字符串中字母的个数。/*案例代码文件名:案例代码文件名:AL7_6.C*/*功能:数组元素作为函数实参功能:数组元素作为函数实参*/#includeintisalp(charc)if(c=a&c=A&c=Z)return(1);elsereturn(0);main()inti,num=0;charstr255;printf(Inputastring:);gets(str);for(i=0;stri!=0;i+)if(isalp(stri)num+;puts(str);printf(num=%dn,num);程序演示程序演示说明:说明:(1)用用数数组组元元素素作作实实参参时时,只只要要数数组组类类型型和和函函数数的的形形参参类类型型一一致致即即可可,并并不不要要求求函函数数的的形形参参也也是是下下标标变变量量。换换句句话话说说,对对数数组组元元素的处理是按普通变量对待的。素的处理是按普通变量对待的。(2)在在普普通通变变量量或或下下标标变变量量作作函函数数参参数数时时,形形参参变变量量和和实实参参变变量量是是由由编编译译系系统统分分配配的的两两个个不不同同的的内内存存单单元元。在在函函数数调调用用时时发发生生的的值传送,是把实参变量的值赋予形参变量。值传送,是把实参变量的值赋予形参变量。Return7.3.2 数组名作为函数的形参和实参数组名作为函数的形参和实参数组名作函数参数时,既可以作形参,也可以作实参。数组名作函数参数时,既可以作形参,也可以作实参。数数组组名名作作函函数数参参数数时时,要要求求形形参参和和相相对对应应的的实实参参都都必必须须是是类类型型相相同的数组(或指向数组的指针变量),都必须有明确的数组说明同的数组(或指向数组的指针变量),都必须有明确的数组说明案例案例7.7已知某个学生已知某个学生5门课程的成绩,求平均成绩。门课程的成绩,求平均成绩。/*案例代码文件名:案例代码文件名:AL7_7.C*/floataver(floata)/*求平均值函数求平均值函数*/inti;floatav,s=0;for(i=0;i5;i+)s+=ai;av=s/5;returnav;voidmain()floatsco5,av;inti;printf(ninput5scores:n);for(i=0;i5;i+)scanf(%f,&scoi);av=aver(sco);/*调用函数,实参为一数组名调用函数,实参为一数组名*/printf(averagescoreis%5.2fn,av);程序演示程序演示进一步:进一步:思考思考1:将函数将函数aver改写成通用的求改写成通用的求n个数的平均数?个数的平均数?floataver(floata,intn)调用处改为:调用处改为:av=aver(sco,5);思思考考2:如如果果在在函函数数aver中中改改变变了了数数组组的的值值,调调用用函函数数中中是是否否随随之变化?之变化?元素元素起始起始地址地址a010001000a110021002a210041004a310061006ai10081008a510101010a610121012a710141014a810161016a910181018a数组数组元素元素起始起始地址地址sco010001000sco110021002sco210041004sco310061006scoi10081008sco510101010sco610121012sco710141014sco810161016sco910181018说明说明:(1)用用数数组组名名作作函函数数参参数数,应应该该在在调调用用函函数数和和被被调调用用函函数数中中分分别别定定义义数数组组,且且数数据据类类型型必必须须一一致致,否否则则结结果果将将出出错错。例例如如,在在本本案案例例中中,形形参参数数组组为为a,实实参参数数组组为为sco,它它们们的数据类型相同。的数据类型相同。(2)C编编译译系系统统对对形形参参数数组组大大小小不不作作检检查查,所所以以形形参参数数组可以不指定大小。例如,本案例中的形参数组组可以不指定大小。例如,本案例中的形参数组a。Return7.4内部变量与外部变量内部变量与外部变量语语言言中中所所有有的的变变量量都都有有自自己己的的作作用用域域。变变量量说说明明的的位位置置不不同同,其其作作用用域域也也不不同同,据据此此将将语语言言中中的变量分为内部变量和外部变量。的变量分为内部变量和外部变量。7.4.1 内部变量内部变量7.4.2 外部变量外部变量Return7.4.1 内部变量内部变量在在一一个个函函数数内内部部说说明明的的变变量量是是内内部部变变量量,它它只只在在该函数范围内有效。该函数范围内有效。也也就就是是说说,只只有有在在包包含含变变量量说说明明的的函函数数内内部部,才才能能使使用用被被说说明明的的变变量量,在在此此函函数数之之外外就就不不能能使使用用这这些些变量了。所以内部变量也称变量了。所以内部变量也称“局部变量局部变量”。例如:例如:intf1(inta)/*函数函数f1*/intb,c;/*a,b,c作用域:仅限于函数作用域:仅限于函数f1()中中*/intf2(intx)/*函数函数f2*/inty,z;/*x,y,z作用域:仅限于函数作用域:仅限于函数f2()中中*/main()intm,n;/*m,n作用域:仅限于函数作用域:仅限于函数main()中中*/关于局部变量的作用域还要说明以下几点:关于局部变量的作用域还要说明以下几点:1主主函函数数main()中中定定义义的的内内部部变变量量,也也只只能能在在主主函函数数中中使使用用,其其它它函函数数不不能能使使用用。同同时时,主主函函数数中中也也不不能能使使用用其其它它函函数数中中定定义义的的内内部部变变量量。因因为为主主函函数数也也是是一一个个函函数数,与与其其它它函函数数是是平平行行关关系系。这这一一点点是是与与其其它语言不同的,应予以注意。它语言不同的,应予以注意。2形形参参变变量量也也是是内内部部变变量量,属属于于被被调调用用函函数数;实实参参变变量量,则则是是调调用函数的内部变量。用函数的内部变量。3允允许许在在不不同同的的函函数数中中使使用用相相同同的的变变量量名名,它它们们代代表表不不同同的的对对象象,分配不同的单元,互不干扰,也不会发生混淆。分配不同的单元,互不干扰,也不会发生混淆。4在复合语句中也可定义变量,其作用域只在复合语句范围内。在复合语句中也可定义变量,其作用域只在复合语句范围内。Return7.4.2 外部变量外部变量在在函函数数外外部部定定义义的的变变量量称称为为外外部部变变量量。以以此此类类推推,在函数外部定义的数组就称为外部数组。在函数外部定义的数组就称为外部数组。外外部部变变量量不不属属于于任任何何一一个个函函数数,其其作作用用域域是是:从从外外部变量的定义位置开始,到本文件结束为止。部变量的定义位置开始,到本文件结束为止。外外部部变变量量可可被被作作用用域域内内的的所所有有函函数数直直接接引引用用,所所以以外部变量又称全局变量。外部变量又称全局变量。案案例例7.9输输入入长长方方体体的的长长(l)、宽宽(w)、高高(h),求求长长方方体体体体积及正、侧、顶三个面的面积。积及正、侧、顶三个面的面积。/*功能:利用全局变量计算长方体的体积及三个面的面积功能:利用全局变量计算长方体的体积及三个面的面积*/ints1,s2,s3;intvs(inta,intb,intc)intv;v=a*b*c;s1=a*b;s2=b*c;s3=a*c;returnv;main()intv,l,w,h;printf(ninputlength,widthandheight:);scanf(%d%d%d,&l,&w,&h);v=vs(l,w,h);printf(v=%ds1=%ds2=%ds3=%dn,v,s1,s2,s3);程序演示对于全局变量还有以下几点说明:对于全局变量还有以下几点说明:(1)在在同同一一源源文文件件中中,允允许许外外部部变变量量和和内内部部变变量量同同名名。在在内内部部变变量的作用域内,外部变量将被屏蔽而不起作用。量的作用域内,外部变量将被屏蔽而不起作用。(2)外外部部变变量量的的作作用用域域是是从从定定义义点点到到本本文文件件结结束束。如如果果定定义义点点之之前前的的函函数数需需要要引引用用这这些些外外部部变变量量时时,需需要要在在函函数数内内对对被被引引用用的的外外部部变变量进行说明。外部变量说明的一般形式为:量进行说明。外部变量说明的一般形式为:extern数据类型数据类型外部变量外部变量,外部变量,外部变量2;注意注意:外部变量的定义和外部变量的说明是两回事。外部变量的:外部变量的定义和外部变量的说明是两回事。外部变量的定义,必须在所有的函数之外,且只能定义一次。而外部变量的说明,定义,必须在所有的函数之外,且只能定义一次。而外部变量的说明,出现在要使用该外部变量的函数内,而且可以出现多次。出现在要使用该外部变量的函数内,而且可以出现多次。案例案例7.10外部变量的定义与说明。外部变量的定义与说明。/*案例代码文件名:案例代码文件名:AL7_10.C*/intvs(intxl,intxw)externintxh;/*外部变量外部变量xh的说明的说明*/intv;v=xl*xw*xh;/*直接使用外部变量直接使用外部变量xh的值的值*/returnv;main()externintxw,xh;/*外部变量的说明外部变量的说明*/intxl=5;/*内部变量的定义内部变量的定义*/printf(xl=%d,xw=%d,xh=%dnv=%d,xl,xw,xh,vs(xl,xw);intxl=3,xw=4,xh=5;/*外部变量外部变量xl、xw、xh的定义的定义*/程序演示程序演示Return7.5变量的动态存储与静态存储简介变量的动态存储与静态存储简介在在语语言言中中,对对变变量量的的存存储储类类型型说说明明有有以以下下四四种种:自自动动变变量量(auto)、寄寄存存器器变变量量(register)、外外部部变变量量(extern)、静静态态变变量量(static)。自自动动变变量量和和寄寄存存器器变变量量属属于于动动态态存存储储方方式式,外外部部变变量量和和静静态态内内部部变变量量属属于于静态存储方式。静态存储方式。7.5.1内部变量的存储方式内部变量的存储方式7.5.2 外部变量的存储方式外部变量的存储方式Return7.5.1内部变量的存储方式内部变量的存储方式1静态存储静态存储静态内部变量静态内部变量(1)定义格式:)定义格式:static数据类型数据类型内部变量表内部变量表;(2)存储特点)存储特点1)静静态态内内部部变变量量属属于于静静态态存存储储。在在程程序序执执行行过过程程中中,即即使使所所在在函函数数调调用用结结束束也也不不释释放放。换换句句话话说说,在在程程序序执执行行期期间间,静静态态内内部部变变量量始始终终存存在在,但但其其它它函函数数是是不不能能引引用用它它们的。们的。2)定定义义但但不不初初始始化化,则则自自动动赋赋以以(整整型型和和实实型型)或或0(字字符符型型);且且每每次次调调用用它它们们所所在在的的函函数数时时,不不再再重新赋初值,只是保留上次调用结束时的值!重新赋初值,只是保留上次调用结束时的值!2动态存储动态存储自动局部变量(又称自动变量)自动局部变量(又称自动变量)(1)定义格式:)定义格式:auto数据类型数据类型变量表变量表;(2)存储特点)存储特点1)自自动动变变量量属属于于动动态态存存储储方方式式。在在函函数数中中定定义义的的自自动动变变量量,只只在该函数内有效;函数被调用时分配存储空间,调用结束就释放。在该函数内有效;函数被调用时分配存储空间,调用结束就释放。2)定定义义而而不不初初始始化化,则则其其值值是是不不确确定定的的。如如果果初初始始化化,则则赋赋初初值操作是在调用时进行的,且每次调用都要重新赋一次初值。值操作是在调用时进行的,且每次调用都要重新赋一次初值。3)由由于于自自动动变变量量的的作作用用域域和和生生存存期期,都都局局限限于于定定义义它它的的个个体体内内(函函数数或或复复合合语语句句),因因此此不不同同的的个个体体中中允允许许使使用用同同名名的的变变量量而而不不会会混混淆淆。即即使使在在函函数数内内定定义义的的自自动动变变量量,也也可可与与该该函函数数内内部部的的复复合合语句中定义的自动变量同名。语句中定义的自动变量同名。案例案例7.13自动变量与静态局部变量的存储特性。自动变量与静态局部变量的存储特性。/*案例代码文件名:案例代码文件名:AL7_13.C*/voidauto_static(void)inta=0;/*自动变量:每次调用都重新初始化自动变量:每次调用都重新初始化*/staticintb=0;/*静态局部变量:只初始化静态局部变量:只初始化1次次*/printf(“%d,%dn”,a,b);+a;+b;main()inti;for(i=0;i5;i+)auto_static();程序演示程序演示7.5.2 外部变量的存储方式外部变量的存储方式外部变量属于静态存储方式:外部变量属于静态存储方式:(1)静态外部变量)静态外部变量只允许被本源文件中的函数引用只允许被本源文件中的函数引用其定义格式为:其定义格式为:static数据类型数据类型外部变量表外部变量表;(2)非静态外部变量)非静态外部变量允许被其它源文件中的函数引用允许被其它源文件中的函数引用定定义义时时缺缺省省static关关键键字字的的外外部部变变量量,即即为为非非静静态态外外部部变变量量。其其它它源源文文件件中中的的函函数数,引引用用非非静静态态外外部部变变量量时时,需需要要在在引引用用函函数数所所在在的的源源文文件中进行说明:件中进行说明:extern数据类型数据类型外部变量表外部变量表;注意注意:在函数内的:在函数内的extern变量说明,表示引用本源文件中的外部变变量说明,表示引用本源文件中的外部变量!而函数外(通常在文件开头)的量!而函数外(通常在文件开头)的extern变量说明,表示引用其它文变量说明,表示引用其它文件中的外部变量。件中的外部变量。静态局部变量和静态外部变量同属静态存储方式,但两者区别较大:静态局部变量和静态外部变量同属静态存储方式,但两者区别较大:(1)定定义义的的位位置置不不同同。静静态态局局部部变变量量在在函函数数内内定定义义,静静态态外外部部变变量量在在函数外定义。函数外定义。(2)作作用用域域不不同同。静静态态局局部部变变量量属属于于内内部部变变量量,其其作作用用域域仅仅限限于于定定义义它的函数内;虽然生存期为整个源程序,但其它函数是不能使用它的。它的函数内;虽然生存期为整个源程序,但其它函数是不能使用它的。静静态态外外部部变变量量在在函函数数外外定定义义,其其作作用用域域为为定定义义它它的的源源文文件件内内;生生存存期期为整个源程序,但其它源文件中的函数也是不能使用它的。为整个源程序,但其它源文件中的函数也是不能使用它的。(3)初始化处理不同。静态局部变量,仅在第)初始化处理不同。静态局部变量,仅在第1次调用它所在的函数次调用它所在的函数时被初始化,当再次调用定义它的函数时,不再初始化,而是保留上时被初始化,当再次调用定义它的函数时,不再初始化,而是保留上1次次调用结束时的值。而静态外部变量是在函数外定义的,不存在静态内部变调用结束时的值。而静态外部变量是在函数外定义的,不存在静态内部变量的量的“重复重复”初始化问题,其当前值由最近初始化问题,其当前值由最近1次给它赋值的操作决定。次给它赋值的操作决定。2007年年4月月1、有以下程序、有以下程序inta=4;intf(intn)intt=0;staticinta=5;if(n%2)inta=6;t+=a+;elseinta=7;+=a+;returnt+a+;main()()ints=a,i=0;for(;(;i2;i+)s+=f(i);printf(“%dn”,s);程序运行后的输出结果是程序运行后的输出结果是()A)24B)28C)32D)362007年年4月月2、以下程序的运行结果是、以下程序的运行结果是_。intk=0;voidfun(intm)m+=k;k+=m;printf(“m=%dk=%d”,m,k+);main()inti=4;fun(i+);printf(“i=%dk=%dn”,i,k);m=4k=4i=5k=52007年年9月月1、在一个、在一个C语言源程序文件中所定义的全局变量,其作用域为:语言源程序文件中所定义的全局变量,其作用域为:A)所在文件的全部范围所在文件的全部范围B)所在程序的全部范围所在程序的全部范围C)所在函数的全部范围所在函数的全部范围D)由具体定义位置和由具体定义位置和extern说明来决定范围说明来决定范围2007年年9月月1、有以下程序、有以下程序#includeinta=1;intf(intc)staticinta=2;c=c+1;return(a+)+c;main()inti,k=0;for(i=0;i2;i+)inta=3;k+=f(a);k+=a;printf(“%dn”,k);程序运行结果是程序运行结果是A)14B)15C)16D)172008年年4月月1、在、在C语言中,只有在使用时才占用内存单元的变量,其存储类型是语言中,只有在使用时才占用内存单元的变量,其存储类型是A)auto和和registerB)extern和和registerC)auto和和staticD)static和和register2008年年9月月1、有以下程序、有以下程序#includevoidfun(inta,intb)intt;t=a;a=b;b=t;main()intc10=1,2,3,4,5,6,7,8,9,0,i;for(i=0;i10;i+=2)fun(ci,ci+1);for(i=0;i10;i+)printf(%d,ci);printf(n);程序的运行结果是程序的运行结果是A)1,2,3,4,5,6,7,8,9,0,B)2,1,4,3,6,5,8,7,0,9,C)0,9,8,7,6,5,4,3,2,1,D)0,1,2,3,4,5,6,7,8,9,2008年年9月月2、有以下程序、有以下程序#includevoidfun(inta,intn)inti,t;for(i=0;in/2;i+)t=ai;ai=an-1-i;an-1-i=t;main()intk10=1,2,3,4,5,6,7,8,9,10,i;fun(k,5);for(i=2;i8;i+)printf(%d,ki);printf(n);程序的运行结果是程序的运行结果是A)345678B)876543C)1098765D)3216782008年年9月月3、有以下程序、有以下程序#include#defineN4voidfun(intaN,intb)inti;for(i=0;iN;i+)bi=aii;main()intxN=1,2,3,4,5,6,7,8,9,10,yN,i;fun(x,y);for(i=0;iN;i+)printf(%d,yi);printf(n);程序的运行结果是程序的运行结果是A)1,2,3,4,B)1,0,7,0,C)1,4,5,9,D)3,4,8,10,2008年年9月月4、以下程的输出结果是、以下程的输出结果是【11】。#includeintfun(intx)staticintt=0;return(t+=x);main()ints,i;for(i=1;i=5;i+)s=fun(i);printf(%dn,s);152008年年9月月5、以下程序的功能是、以下程序的功能是:通过函数通过函数func输入字符,并统计输入字符的个输入字符,并统计输入字符的个数。输入时用字符数。输入时用字符作为输入结束标志。请填空。作为输入结束标志。请填空。#includelong【14】;main()longn;n=func();printf(n=%ldn,n);longfunc()longm;for(m=0;getchar()!=;【15】);returnm;func()m+2009年年3月月1、设函数中有整型变量、设函数中有整型变量n,为保证其在未赋初值的情况下初值为为保证其在未赋初值的情况下初值为0,应应该选择的存储类别是该选择的存储类别是A)autoB)registerC)staticD)auto或或register2009年年9月月1、以下函数、以下函数findmax拟实现在数组中查找最大值并作为函数值返回拟实现在数组中查找最大值并作为函数值返回,但程序中有错导致不能实现预定功能但程序中有错导致不能实现预定功能#defineMIN-2147463647intfindmax(intx,intn)inti,max;for(i=0;in;i+)max=MIN;if(maxxi)max=xi;returnmax;造成错误的原因是造成错误的原因是A)定义语句定义语句inti,max中中max未赋值未赋值B)赋值语句赋值语句max=MIN;中,不应该给中,不应该给max赋赋MIN值值C)语句语句if(maxxi)max=xi;中判断条件设置错误中判断条件设置错误D)赋值语句赋值语句max=MIN;放错了位置放错了位置2009年年9月月2、有以下程序、有以下程序#includeintf(intn);main()inta=3,s;s=f(a);s=s+f(a);printf(%dn,s);intf(intn)staticinta=1;n+=a+;returnn;程序运行后的输出结果是程序运行后的输出结果是A)7B)8C)9D)102009年年9月月3、有以下程序、有以下程序#includeinta=5;voidfun(intb)inta=10;a+=b;printf(%d,a);main()intc=20;fun(c);a+=c;printf(%dn,a);程序运行后的输出结果是程序运行后的输出结果是【】3025题盘练习题盘练习注意函数类型、参数类型:注意函数类型、参数类型:25-2函数调用语句:函数调用语句:83-1全局变量:全局变量:72-1
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号