1、第第6 6章章 函数函数第第6章章函函数数第1页第第6 6章章 函数函数概概述述C语语言言是是由由函函数数组组成成。经经过过函函数数定定义义把把实实现现细细节节封封闭闭起起来来,经经过过函函数数调调用用组组合合各各种种功功效效,就就象象用一个个构件盖房子似。用一个个构件盖房子似。本本章章介介绍绍C语语言言中中函函数数定定义义、函函数数调调用用、函函数数间间数数据据传传递递问问题题以以及及变变量量存存放放类类别别、作作用用域域和和生生存期。存期。第2页第第6 6章章 函数函数考评内容考评内容1.函数定义方法。函数定义方法。2.函数类型和返回值。函数类型和返回值。3.形式参数与实际参数,参数值传递
2、。形式参数与实际参数,参数值传递。4.函数正确调用,嵌套调用,递归调用。函数正确调用,嵌套调用,递归调用。5.局部变量和全局变量。局部变量和全局变量。6.变量存放类别、变量作用域和生存期。变量存放类别、变量作用域和生存期。7.内部函数与外部函数。内部函数与外部函数。第3页第第6 6章章 函数函数序言序言6.1C语言程序结构语言程序结构C程序程序程序文件程序文件1函数11函数12函数1n程序文件程序文件m函数m1函数m2函数mn程序文件程序文件2函数21函数22函数2n第4页第第6 6章章 函数函数 说明:说明:1.函数类型和返回值。函数类型和返回值。2.任任何何一一个个C程程序序可可由由多多个
3、个源源程程序序文文件件(.C)组组成成。每个源程序文件(每个源程序文件(.C)由多个函数组成。由多个函数组成。3.任任何何一一个个C程程序序且且必必须须有有且且只只能能有有一一个个main函函数数。C程程序序执执行行都都是是从从main函函数数开开始始,调调用用其其它它函函数数后后流程回到流程回到mian函数,在函数,在main函数中结束。函数中结束。4.4.当当main函函数数调调用用其其它它函函数数时时,我我们们称称main函函数数为为主主调调函函数数,而而称称其其它它函函数数为为被被调调函函数数。当当其其它它函函数数调用另外一些函数时,它们又成为主调函数。调用另外一些函数时,它们又成为主
4、调函数。第5页第第6 6章章 函数函数 说明:说明:5.C语言中使用函数种类有各种,我们可语言中使用函数种类有各种,我们可以从不一样角度来了解。以从不一样角度来了解。函数从用户角度分为:函数从用户角度分为:标准函数(库函数)标准函数(库函数)用户自定义函数用户自定义函数函数从形式上分为:函数从形式上分为:无参函数无参函数有参函数有参函数第6页第第6 6章章 函数函数例例例例6-1 6-1 6-1 6-1 函数举例函数举例函数举例函数举例#includefunc1()/*fun1函数定函数定义义*/printf(*n);printf(THISISACFUNCTIONEXAMPLE!n);prin
5、tf(*n);main()func1();/*main函数调用函数调用fun1函数函数*/程序运行结果以下:程序运行结果以下:*THISISACFUNCTIONEXAMPLE!*第7页第第6 6章章 函数函数普通格式普通格式类型标识符类型标识符 函数名(形参类型说明表)函数名(形参类型说明表)申明语句申明语句执行语句执行语句 例例有参函数有参函数intmax(intx,inty)intz;z=xy?x:y;return(z);例例有参函数有参函数不不能以下定义能以下定义intmax(intx,y)intz;z=xy?x:y;return(z);例例空函数空函数dummy()6.2函数定义普通形
6、式函数定义普通形式 例例无参函数无参函数fun1()printf(“*n”);或或intfun1()printf(“*n”);函数返回值类型缺省函数返回值类型缺省int型型无返回值无返回值void正当标识符正当标识符用于指出每个形参类型、名用于指出每个形参类型、名称。称。注意,即使没有形参,()注意,即使没有形参,()也不能省也不能省函数体函数体函数体为函数体为空空第8页第第6 6章章 函数函数例例例例6-2 6-2 6-2 6-2 定义一个函数,用于求两个数相乘结果定义一个函数,用于求两个数相乘结果定义一个函数,用于求两个数相乘结果定义一个函数,用于求两个数相乘结果 main()floatm
7、ul(floatx,floaty);/*mul函数申明函数申明*/floata,b,c;scanf(“%f,%f”,&a,&b);c=mul(a,b);/*调用调用mul函数求两数相乘结果函数求两数相乘结果*/printf(“Theresultis%f”,c);floatmul(floatx,floaty)/*mul函数以及形参定义函数以及形参定义*/floatz;z=x*y;return(z);/*返回函数值语句返回函数值语句*/程序运行结果以下:程序运行结果以下:2.1,3.4 Theresultis7.140000第9页第第6 6章章 函数函数c=mul(a,b);(main函数)函数)
8、(mul函数)函数)floatmul(floatx,floaty)floatz;z=x*y;return(z);例例例例6-2 6-2 6-2 6-2 程序执行过程程序执行过程程序执行过程程序执行过程 第10页第第6 6章章 函数函数 函数间数据传递方式有三种:函数间数据传递方式有三种:1.参数传递(值传递和地址传递)参数传递(值传递和地址传递)利用实参和形参实现(实参利用实参和形参实现(实参形参)形参)2.函数返回值函数返回值 利用利用return语句实现(形参语句实现(形参实参)实参)3.全局变量全局变量6.3函数之间数据传递函数之间数据传递 第11页第第6 6章章 函数函数 1.1.形参
9、加实参形参加实参 形式参数:形式参数:定义函数时函数名后面括号中变量名。定义函数时函数名后面括号中变量名。形参出现在被调函数定义中。形参出现在被调函数定义中。实际参数:实际参数:调用函数时函数名后面括号中表示式。调用函数时函数名后面括号中表示式。实参出现在主调函数调用被调函数语句中。实参出现在主调函数调用被调函数语句中。6.3.1函数参数函数参数实参加形参实参加形参 2.2.实参实参-形参传递数据方式形参传递数据方式 值传递值传递含义含义:在调用函数时,主调函数把实参变在调用函数时,主调函数把实参变量值复制给被调函数形参,在函数内部则使用形量值复制给被调函数形参,在函数内部则使用形参中值进行处
10、理。参中值进行处理。值传递方式:值传递方式:数据复制数据复制 地址复制地址复制 第12页第第6 6章章 函数函数例例6-3 6-3 求三个数平均值求三个数平均值 floataver(floatf1,floatf2,floatf3)floatz;z=(f1+f2+f3)/3;return(z);main()floata,b,c,average;printf(pleaseentera,b,c:n);scanf(%f,%f,%fn,&a,&b,&c);average=aver(a,b,c);printf(average=%fn,average);程序运行结果以下:程序运行结果以下:pleaseent
11、era,b,c:4.0,8.0,5.0 average=5.666667值传递方式一值传递方式一:数据复制数据复制值传递(数据复制)第13页第第6 6章章 函数函数例例6-46-4编写一个函数交换主函数中两个变量值编写一个函数交换主函数中两个变量值 swap(inta,intb)inttemp;temp=a;a=b;b=temp;printf(“na=%db=%dn”,x,y);main()intx,y;printf(“pleaseenterxandy:”);scanf(“%d%d”,&x,&y);printf(“nx=%dy=%d”,a,b);printf(“n-doswap-”);swap
12、(x,y);printf(“nx=%dy=%d”,x,y);.200A5变量变量a 变量变量b(main)8558 58数据复制数据复制 变量变量temp 变量变量y 变量变量x(swap)值传递(数据复制)程序运行结果以下:程序运行结果以下:pleaseenterxandy:58 x=5y=8-doswap-a=8b=5x=5y=8第14页第第6 6章章 函数函数例例6-56-5求一维数组中各元素之和求一维数组中各元素之和 main()inti,a10;floatmv;floatsub();for(i=0;i10;i+)scanf(%d,&ai);mv=sub(a);printf(SUB=%
13、fn,mv);floatsub(intd10)floatsum;inti;for(sum=0,i=0;i10;i+)sum+=di;returnsum;值传递(地址复制)值传递方式二值传递方式二:地址复制地址复制1424681012161820200A200C200Ead程序运行结果以下:程序运行结果以下:2468101214161820 SUB=110.000000第15页第第6 6章章 函数函数 注意:注意:6.3.1函数参数函数参数实参加形参实参加形参1.1.数组名代表数组首地址。数组名代表数组首地址。2.2.地址传递方式是经过将实参存放地址值传地址传递方式是经过将实参存放地址值传给形参
14、来实现数据传送。其实质是让形参和给形参来实现数据传送。其实质是让形参和实参使用相同存放空间。实参使用相同存放空间。第16页第第6 6章章 函数函数函数参数小结函数参数小结:6.3.1函数参数函数参数实参加形参实参加形参 1.1.形参在被调函数中定义,实参在主调函数中形参在被调函数中定义,实参在主调函数中定义。定义。2.2.形参定义时编译系统并不为其分配存放空形参定义时编译系统并不为其分配存放空间,也无初值,只有在函数调用时,暂时分配存间,也无初值,只有在函数调用时,暂时分配存储空间,接收来自实参值,函数调用结束,形储空间,接收来自实参值,函数调用结束,形参所占用内存空间释放,值消失。所以,形参
15、参所占用内存空间释放,值消失。所以,形参只有在函数内部有效。函数调用结束返回主调函只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。数后则不能再使用该形参变量。第17页第第6 6章章 函数函数函数参数小结函数参数小结:6.3.1函数参数函数参数实参加形参实参加形参 3.3.实参能够是常量、变量、表示式、函数、实参能够是常量、变量、表示式、函数、数组、指针等,不论实参是何种类型量,在数组、指针等,不论实参是何种类型量,在进行函数调用时,它们都必须含有确定值,进行函数调用时,它们都必须含有确定值,方便把这些值传送给形参。方便把这些值传送给形参。4.4.实参和形参在数量、类型、次
16、序上应一实参和形参在数量、类型、次序上应一致,不然会发生致,不然会发生“类型不匹配类型不匹配”错误。错误。5.5.函数调用中发生数据传送是单向。函数调用中发生数据传送是单向。(实参(实参形参形参)第18页第第6 6章章 函数函数 返回语句返回语句:形式:形式:return(return(表示式表示式)。功效:功效:使程序控制从被调函数返回到主调函数使程序控制从被调函数返回到主调函数中,中,同时把被调函数返回值带给主调函数。同时把被调函数返回值带给主调函数。6.3.2函数返回值函数返回值表示式能够是常量、变量、函数、数表示式能够是常量、变量、函数、数组元素、地址常量和其它形式表示式组元素、地址常
17、量和其它形式表示式等。等。第19页第第6 6章章 函数函数例例6-66-6计算分段函数值计算分段函数值#includefloatsub2(floata)floatb;if(a=0&a1)b=a+1;elseif(a2)b=2*a+5;elseb=0;return(b);main()floatx,y;printf(enterx:);scanf(%f,&x);y=sub2(x);printf(x=%f,y=%f,x,y);程序运行结果以下:程序运行结果以下:enterx:1.5 x=1.500000,y=8.000000第20页第第6 6章章 函数函数 说明:说明:1.return语句将被调用函数
18、中一个确定值带回语句将被调用函数中一个确定值带回主调函数中去,且一个主调函数中去,且一个return语句只能带回一个返语句只能带回一个返回值。回值。2.2.一个函数体内能够有多个返回语句,一个函数体内能够有多个返回语句,不论执行不论执行到哪一个,函数都结束,回到主调函数。到哪一个,函数都结束,回到主调函数。3.return 3.return后面括号内若是一个常量或变量,则后面括号内若是一个常量或变量,则能够省略能够省略()()4.4.在定义函数时应该指定函数返回值类型在定义函数时应该指定函数返回值类型(简称简称函数类型),函数类型),returnreturn语句中表示式类型应与定义函语句中表示
19、式类型应与定义函数时所指定函数类型一致。数时所指定函数类型一致。return0;等价于等价于return(0);#includefloatsub2(floata)floatb;if(a=0&a1)return(a+1);elseif(a2)return(2*a+5);elsereturn0;main()floatx,y;printf(enterx:);scanf(%f,&x);y=sub2(x);printf(x=%f,y=%f,x,y);6.3.2函数返回值函数返回值/*/*例例6-7求两数中最大值求两数中最大值*/#includemax(floatx,floaty)floatz;z=xy?
20、x:y;return(z);main()floata,b;intc;scanf(%f%f,&a,&b);c=max(a,b);printf(MAXis%dn,c);程序运行结果以下:程序运行结果以下:4.56.8 MAXis6第21页第第6 6章章 函数函数 说明:说明:1.1.假如函数类型和假如函数类型和return语句中表示式值语句中表示式值类型不一致,则以函数类型为准,自动进行类类型不一致,则以函数类型为准,自动进行类型转换。型转换。2.2.不带返回值函数,能够明确定义为不带返回值函数,能够明确定义为“空空类型类型”,类型说明符为,类型说明符为“void”6.3.2函数返回值函数返回值第
21、22页第第6 6章章 函数函数6.4.1函数调用普通形式函数调用普通形式6.4函数调用函数调用 调用形式:调用形式:函数名函数名(实参表实参表);说明:说明:1.1.实参表中实参个数、实参值类型以及出实参表中实参个数、实参值类型以及出现次序应与形参表实际情况相匹配。现次序应与形参表实际情况相匹配。2.2.假如被调用函数是无参函数,则函数调用时假如被调用函数是无参函数,则函数调用时也没有实参,但函数名后面圆括号不能省略。也没有实参,但函数名后面圆括号不能省略。3.3.在函数调用中还应该注意一个问题是求值在函数调用中还应该注意一个问题是求值次序问题。次序问题。第23页第第6 6章章 函数函数mai
22、n()inti=8;printf(%d,%d,%d,%dn,+i,-i,i+,i-);例例6-8 6-8 参数求值次序参数求值次序从右到左求值从右到左求值运行结果:运行结果:8,7,7,8从左到右求值从左到右求值运行结果:运行结果:9,8,8,9第24页第第6 6章章 函数函数函数表示式:函数表示式:例例 c=max(a,b);c=max(a,b);函数语句:函数语句:例例 fun1();fun1();函数参数:函数参数:例例 printf(“%d”,max(a,b);printf(“%d”,max(a,b);6.4.2函数调用方式函数调用方式第25页第第6 6章章 函数函数 1.1.对被调用
23、函数要求对被调用函数要求必须是已存在函数。必须是已存在函数。库函数库函数:stdio.h string.h math.h stdio.h string.h math.h。用户自定义函数用户自定义函数:在主调函数中对被调在主调函数中对被调函数作申函数作申明。明。6.4.3对被调用函数申明对被调用函数申明 2.2.函数申明函数申明普通形式普通形式1 1:函数类型:函数类型 函数名函数名(形参类型形参类型1,1,形参形参类型类型2,);2,);普通形式普通形式2:2:函数类型函数类型 函数名函数名(形参类型形参类型1 1 形参形参1,1,形参类型形参类型2 2 形参形参2,)2,);第26页第第6
24、6章章 函数函数main()longf(intn);/*对被调函数对被调函数f申明申明*/longsum;sum=1+f(2)+f(3)+f(4)+f(5);printf(“sum=%ldn”,sum);longf(intn)/*函数函数f定义定义*/inti;longy=1;for(i=1;i=n;i+)y=y*i;return(y);例例6-9 6-9 编程计算编程计算1!+2!+3!+4!+5!1!+2!+3!+4!+5!程序运行情况以下:程序运行情况以下:sum=153等价于等价于:longf(int);第27页第第6 6章章 函数函数 注意:注意:1.1.函数定义与函数申明不一样函数
25、定义与函数申明不一样函数申明位置:主调函数数听说明部分函数申明位置:主调函数数听说明部分 2 2.以下情况下,可不作函数说明以下情况下,可不作函数说明 (1 1)若函数返值是)若函数返值是charchar或或intint型,系统自动按型,系统自动按intint型处理。型处理。(2 2)被调用函数定义出现在主调函数之前。)被调用函数定义出现在主调函数之前。(3 3)假如在全部函数定义之前,在函数外预先)假如在全部函数定义之前,在函数外预先说明了各个函数类型,则在以后各主调函数说明了各个函数类型,则在以后各主调函数中,可不再对被调函数作申明。中,可不再对被调函数作申明。6.4.3对被调用函数申明对
26、被调用函数申明第28页第第6 6章章 函数函数对先引用后定义(位于主调函教之后)函数在对先引用后定义(位于主调函教之后)函数在引用前应先申明。引用前应先申明。注意:注意:3 3.以下情况下,可不作函数说明以下情况下,可不作函数说明 对库函数调用不需要再作申明,但必须把包对库函数调用不需要再作申明,但必须把包含该函数头文件用含该函数头文件用 includeinclude命令包含在源文件命令包含在源文件前部。前部。6.4.3对被调用函数申明对被调用函数申明第29页第第6 6章章 函数函数例例 函数申明举例函数申明举例floatf(floatb);/*函数函数f申明申明*/main()floatf(
27、floatb)/*函数函数f定义定义*/第30页第第6 6章章 函数函数嵌套调用嵌套调用C C要求:函数定义不可嵌套,但函数能够嵌套要求:函数定义不可嵌套,但函数能够嵌套调用调用6.5函数嵌套调用函数嵌套调用voidaia(),ber(),cal();/*函数申明函数申明*/main()printf(“Iaminmain.n”);aia();voidaia()printf(“NowIaminaia.n”);ber();voidber()printf(“NowIaminber.n”);cal();voidcal()printf(“NowIamincal.n”);程序运行情况以下:程序运行情况以下
28、:Iaminmain.NowIaminaia.NowIaminber.NowIamincal.第31页第第6 6章章 函数函数例例6-10 6-10 程序执行过程。程序执行过程。mainmainmainmain函数函数函数函数调用函调用函调用函调用函数数数数aia;aia;aia;aia;函数函数函数函数 aiaaiaaiaaia 调用函数调用函数调用函数调用函数berber;函数函数函数函数 calcalcalcal 调用调用调用调用返回返回返回返回函数函数函数函数 berberberber 调用函数调用函数调用函数调用函数calcal;调用调用返回返回第32页第第6 6章章 函数函数例例6
29、-11 6-11 计算计算s=2s=22 2!+3!+32 2!longf1(intp)intk;longr;longf2(int);k=p*p;r=f2(k);returnr;longf2(intq)longc=1;inti;for(i=1;i=q;i+)c=c*i;returnc;main()inti;longs=0;for(i=2;i1)n(n-1)(n1)1 (n=0,1)1 (n=0,1)n!=n!=floatfac(intn)floatf;if(n0)printf(“nn0,dataerror!”);f=-1;elseif(n=0|n=1)f=1;elsef=fac(n-1)*n;
30、return(f);main()intn;floaty;printf(“inputaintegernumber:”);scanf(“%d”,&n);y=fac(n);printf(“n%d!=%.2f”,n,y);程序运行结果以下:程序运行结果以下:inputaintegernumber:4 4!=24.00第36页第第6 6章章 函数函数例例6-13 6-13 程序执行过程程序执行过程主函数主函数 第一次调用第一次调用 第二次第二次 第三次第三次 第四次第四次 n=4 n=4 y=fac(4);y=fac(4);调用调用 n=4n=4 f=fac(3)*4;f=fac(3)*4;调用调用 n
31、=3n=3 f=fac(2)*3;f=fac(2)*3;调用调用 n=2n=2 f=facto(1)*2;f=facto(1)*2;n=1n=1 return(1);return(1);返回返回 f=1*2=2f=1*2=2 return(2)return(2)返回返回 f=2*3=6f=2*3=6 return(6)return(6)返回返回 f=6*4=24f=6*4=24 return(24)return(24)返回返回 y=24y=24 递归递归返回返回过程过程递归递归调用调用过程过程floatfac(intn)floatf;if(n0)printf(“nn0)printf(%d,c)
32、;elseprintf(%d,0);main()inta5,i;printf(input5numbers:n);for(i=0;i5;i+)scanf(%d,&ai);ff(ai);程序运行结果以下:程序运行结果以下:input5numbers:238399 208390值传递(数据复制)形参形参:变量变量实参实参:数组元素数组元素第39页第第6 6章章 函数函数例例6-15 6-15 求数组中元素最大值。求数组中元素最大值。main()intmax(intx,inty);inta10,b,i;printf(“input10numbers:”);for(i=0;i10;i+)scanf(%d,
33、&ai);b=0;for(i=0;iy?x:y;return(z);程序运行结果以下:程序运行结果以下:input10numbers:241534156778910 maxis78值传递(数据复制)第一个实参第一个实参:变量变量第二个实参第二个实参:数组元素数组元素形参形参:变量变量第40页第第6 6章章 函数函数 数组名作函数参数用两种形式数组名作函数参数用两种形式将数组名作为实参来调用函数,而在被调函数定将数组名作为实参来调用函数,而在被调函数定义中,用指针变量作形参来接收它义中,用指针变量作形参来接收它 将数组名作为实参来调用函数,而在被调用函数将数组名作为实参来调用函数,而在被调用函数
34、定义中,用数组名作形参来接收它。定义中,用数组名作形参来接收它。注意:注意:用数组名作实参时,并不是把数组中各元素值传给用数组名作实参时,并不是把数组中各元素值传给形参,而是把数组首地址传给形参形参,而是把数组首地址传给形参,即地址传递方式。即地址传递方式。6.7.2数组名作函数参数数组名作函数参数第41页第第6 6章章 函数函数例例6-16 6-16 改用数组名作函数参数。判别一个整数数组改用数组名作函数参数。判别一个整数数组中各元素值,若大于中各元素值,若大于0 0则输出该值,若小于等于则输出该值,若小于等于0 0则则输出输出0 0。voidff(inta5)inti;printf(nva
35、luesofa:);for(i=0;i5;i+)if(ai0)ai=0;printf(%d,ai);main()intb5,i;printf(ninput5numbers:);for(i=0;i5;i+)scanf(%d,&bi);printf(initialvaluesofb:);for(i=0;i5;i+)printf(%d,bi);ff(b);printf(nlastvaluesofb:);for(i=0;i5;i+)printf(%d,bi);值传递(地址传递)-24560910021008100A100410061000ba0程序运行结果以下:程序运行结果以下:input5numbe
36、rs:-245690 initialvaluesofb:-245690valuesofa:045690lastvaluesofb:045690形参形参:数组名数组名实参实参:数组名数组名第42页第第6 6章章 函数函数 数组名作函数参数时注意数组名作函数参数时注意用数组名作函数参数,应该在主调函数和被调用数组名作函数参数,应该在主调函数和被调用函数分别定义实参和形参数组,不能只在一用函数分别定义实参和形参数组,不能只在一方定义。方定义。实参数组和形参数组必须类型相同,形参数组实参数组和形参数组必须类型相同,形参数组能够不指明长度。但为了在被调用函数中处理能够不指明长度。但为了在被调用函数中处理
37、数组元素需要,能够另设一个参数,传递数组数组元素需要,能够另设一个参数,传递数组元素个数。元素个数。6.7.2数组名作函数参数数组名作函数参数voidff(inta5)inti;printf(nvaluesofa:);for(i=0;i5;i+)if(ai0)ai=0;printf(%d,ai);main().ff(b);.voidff(a,intn)for(i=0;in;i+)ff(b,5);第43页第第6 6章章 函数函数 数组名作函数参数时注意数组名作函数参数时注意 数组名作函数实参时,不是把数组值传递给形数组名作函数实参时,不是把数组值传递给形参,而是把实参数组地址传递给形参数组,这么
38、参,而是把实参数组地址传递给形参数组,这么两个数组就同占一段内存单元。利用这一点能够实两个数组就同占一段内存单元。利用这一点能够实现被调函数经过修改形参数组值来到达改变主调函现被调函数经过修改形参数组值来到达改变主调函数中实参数组值目标。数中实参数组值目标。6.7.2数组名作函数参数数组名作函数参数第44页第第6 6章章 函数函数 多维数组也能够作函数参数,但需注意:多维数组也能够作函数参数,但需注意:在函数定义时对形参数组能够指定每一维长度,在函数定义时对形参数组能够指定每一维长度,也可省去第一维长度,但不能省略第二维长度。也可省去第一维长度,但不能省略第二维长度。6.7.2数组名作函数参数
39、数组名作函数参数形参数组第一维大小能够是任意。形参数组第一维大小能够是任意。int array(int a310)int array(int a310);int array(int a 10)int array(int a 10);int array(int a3)int array(int a3);int array(int a )int array(int a );第45页第第6 6章章 函数函数例例6-18 6-18 求求3434矩阵中值最大那个元素,以及该元素矩阵中值最大那个元素,以及该元素所在行号和列号。所在行号和列号。max_v(intarray4)inti,j,max,r,c;m
40、ax=array00;for(i=0;i3;i+)for(j=0;jmax)max=arrayij;r=i;c=j;printf(“maxislocated:”);printf(“%drow,%dcolumn”,r,c);return(max);main()inta34,i,j,c;for(i=0;i3;i+)for(j=0;j4;j+)scanf(“%d”,&aij);c=max_v(a);printf(“themaxnumberis%dn”,c);值传递(地址传递)程序运行结果以下:程序运行结果以下:2356 84329 216410 maxislocated:1row,3columthe
41、maxnumberis29形参形参:二维数组,省略了第一维长度二维数组,省略了第一维长度注意:注意:第二维长度不能省略,且应与实第二维长度不能省略,且应与实参数组第一维长度相等参数组第一维长度相等实参实参:二维数组二维数组第46页第第6 6章章 函数函数 数组名作函数参数小结:数组名作函数参数小结:1.1.用数组元素作实参时,只要求实参数组元素用数组元素作实参时,只要求实参数组元素类型和函数形参变量类型一致,形参并不要求类型和函数形参变量类型一致,形参并不要求也是数组元素。用数组名作函数参数时,则要求也是数组元素。用数组名作函数参数时,则要求实参和相对应形参都必须是类型相同数组,实参和相对应形
42、参都必须是类型相同数组,都必须有明确数组定义,当形参和实参二者不都必须有明确数组定义,当形参和实参二者不一致时,就会发生错误。一致时,就会发生错误。6.7.2数组名作函数参数数组名作函数参数第47页第第6 6章章 函数函数 数组名作函数参数小结数组名作函数参数小结:2.2.用数组元素作实参时,形参变量和实参数用数组元素作实参时,形参变量和实参数组元素是由编译系统分配两个不一样内存单组元素是由编译系统分配两个不一样内存单元,在函数调用时实参加形参之间采取元,在函数调用时实参加形参之间采取“数据复数据复制制”方式传递数据。用数组名作函数参数时,所方式传递数据。用数组名作函数参数时,所采取是采取是“
43、地址传递地址传递”方式,也就是说把实参数组方式,也就是说把实参数组首地址赋予形参数组名。首地址赋予形参数组名。这么形参数组和实这么形参数组和实参数组实为同一数组,共同拥有一段内存空间。参数组实为同一数组,共同拥有一段内存空间。6.7.2数组名作函数参数数组名作函数参数第48页第第6 6章章 函数函数6.8变量存放类型变量存放类型6.8.1变量定义方式变量定义方式在在C C语言中每个变量都有两个属性:语言中每个变量都有两个属性:数据类型数据类型存放类型存放类型 变量完整定义格式应为:变量完整定义格式应为:存放类型标识符存放类型标识符 数据类型标识符数据类型标识符 变量名变量名;详细来说包含四种:
44、详细来说包含四种:自动自动(auto)auto),静态静态(static),static),存放器存放器(register)register),外部外部(extern)extern)。第49页第第6 6章章 函数函数6.8.2变量存放位置、生存期以及作用域变量存放位置、生存期以及作用域 变量存放位置分为三部分:变量存放位置分为三部分:程序区、静态存放区和动态存放区。程序区、静态存放区和动态存放区。变量生存期分为两种:变量生存期分为两种:静态存放和动态存放静态存放和动态存放 变量作用域分为两种:变量作用域分为两种:局部变量和全局变量局部变量和全局变量 (1)静态存放:变量存放在内存中静态存放区,
45、在编译时就分静态存放:变量存放在内存中静态存放区,在编译时就分配了内存单元(存放空间),在整个程序运行期间,该变量配了内存单元(存放空间),在整个程序运行期间,该变量占有固定存放单元,变量值都一直存在,程序结束后,这部占有固定存放单元,变量值都一直存在,程序结束后,这部分空间才释放。这类变量分空间才释放。这类变量生存期为整个程序生存期为整个程序。(2)(2)动态存放:变量存放在内存中动态存放区,在程序运行过程动态存放:变量存放在内存中动态存放区,在程序运行过程中,只有当变量所在函数被调用时,编译系统暂时为该变量分中,只有当变量所在函数被调用时,编译系统暂时为该变量分配一段内存单元,该变量有值,
46、函数调用结束,变量值消失,配一段内存单元,该变量有值,函数调用结束,变量值消失,这部分空间释放。我们说这类变量生存期仅在这部分空间释放。我们说这类变量生存期仅在函数调用期间。函数调用期间。第50页第第6 6章章 函数函数局部变量局部变量-内部变量内部变量定义:在一个函数或复合语句内定义变量,称为局定义:在一个函数或复合语句内定义变量,称为局部变量。局部变量仅在定义它函数或复合语句内部变量。局部变量仅在定义它函数或复合语句内有效。有效。变量作用域变量作用域:注意:注意:1.1.函数形参以及函数体内或复合语句内定义函数形参以及函数体内或复合语句内定义变量均属于局部变量。变量均属于局部变量。2 2.
47、不一样函数中同名变量,占不一样内存单元。不一样函数中同名变量,占不一样内存单元。第51页第第6 6章章 函数函数func()intx=3;intx=2;/*复合语句中局部变量复合语句中局部变量x*/printf(func1:x=%dn,x);/*输出复合语句中变量输出复合语句中变量x*/printf(func2:x=%dn,x);/*输出函数输出函数func中变量中变量x*/main()intx=10;printf(main1:x=%dn,x);/*输出主函数内变量输出主函数内变量x*/func();printf(main2:x=%dn,x);/*输出主函数内变量输出主函数内变量x*/运行结果
48、:运行结果:main1:x=10func1:x=2func2:x=3main2:x=10 例例6-19局部变量举例局部变量举例第52页第第6 6章章 函数函数 全局变量全局变量-外部变量外部变量 定义:假如变量是在全部函数之外定义,就称定义:假如变量是在全部函数之外定义,就称为全局变量,其作用范围为从定义处开始,到源文为全局变量,其作用范围为从定义处开始,到源文件结束。件结束。变量作用域变量作用域:说明:说明:假如在定义之前使用该全局变量,用假如在定义之前使用该全局变量,用externextern加加以申明,则可扩展全局变量作用域为从以申明,则可扩展全局变量作用域为从externextern申
49、明开始到源文件结束。申明开始到源文件结束。第53页第第6 6章章 函数函数intx=100;/*定义全局变量定义全局变量x并初始化并初始化*/main()intx=10;/*定义局部变量定义局部变量x,main函数内有效函数内有效*/func1();func2();printf(main:x=%dn,x);func1()intx=500;/*定义局部变量定义局部变量x,func1函数内有效函数内有效*/x+=100;printf(func1:x=%dn,x);func2()x+=100;/*使用全局变量使用全局变量*/printf(func2:x=%dn,x);/*输出全局变量输出全局变量x*
50、/运行结果:运行结果:func1:x=600func2:x=200main:x=10 例例6-20全局变量举例全局变量举例第54页第第6 6章章 函数函数 全局变量和局部变量小结:全局变量和局部变量小结:1.1.不一样函数内局部变量能够同名,互不影响。不一样函数内局部变量能够同名,互不影响。2.2.全局变量与局部变量能够同名,在局部变量全局变量与局部变量能够同名,在局部变量起作用范围内,全局变量不起作用。起作用范围内,全局变量不起作用。3.3.全局变量初始化只能有一次,而且是在对全局变量初始化只能有一次,而且是在对全局变量定义时候。全局变量定义时候。变量作用域变量作用域:第55页第第6 6章章
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100