《C程序设计(第四版)(谭浩强编)教程-第7章 用函数实现模块化程序设计.ppt》由会员分享,可在线阅读,更多相关《C程序设计(第四版)(谭浩强编)教程-第7章 用函数实现模块化程序设计.ppt(72页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C 程序设计函 数1C语言程序设计-第5章 函数第第7章章 函函 数数1.1.函数概述函数概述2.2.函数定义的一般形式函数定义的一般形式3.3.函数的调用、参数和返回值函数的调用、参数和返回值4.4.局部变量和全局变量局部变量和全局变量5.5.变量的存储类型变量的存储类型6.6.内部函数和外部函数内部函数和外部函数2C语言程序设计-第5章 函数dmainabcgkfhjiel模块化程序示意图:1.1.函数概述函数概述3C语言程序设计-第5章 函数函数调用程序实例#include#include#include#include intintintint main()main()main()ma
2、in()printstarprintstarprintstarprintstar()()()();print_messageprint_messageprint_messageprint_message()()()();printstarprintstarprintstarprintstar();();();();void void void void printstarprintstarprintstarprintstar()()()()printfprintfprintfprintf(“*n*n*n*n”););););void void void void print_messagepr
3、int_messageprint_messageprint_message()()()()printf(printf(printf(printf(“howhowhowhow do you do!n do you do!n do you do!n do you do!n”););););调用函数调用函数用户自定义函数用户自定义函数4C语言程序设计-第5章 函数1 函数概述函数概述(Function)n nC语言用函数实现程序模块化n n一个程序由一个或多个源程序文件组成n n一个源程序文件由一个或多个函数组成n nC程序的执行从main函数开始,并回到main函数结束n n函数之间可以相互调用,
4、或调用自身n n不能调用main函数n n函数之间相互独立,不存在从属关系5C语言程序设计-第5章 函数函数的分类(1)从使用角度分:从使用角度分:标准库函数标准库函数:以程序库的形式直接提供给以程序库的形式直接提供给用户使用。用户使用。stdio.hstdio.h:gets():gets()、printfprintf()()math.hmath.h:sin():sin()、sqrtsqrt()()用户自定义函数用户自定义函数:由用户自己建立定义。:由用户自己建立定义。6C语言程序设计-第5章 函数函数的分类(2)从函数形式分:从函数形式分:vv无参函数无参函数:调用函数时主函数不将数:调用函
5、数时主函数不将数据传送给被调函数。用于完成特定功据传送给被调函数。用于完成特定功能的操作。能的操作。如:如:c=c=getchargetchar()()vv有参函数有参函数:调用函数时在主调函数和:调用函数时在主调函数和被调函数之间有参数传递。被调函数之间有参数传递。如:如:putchar(cputchar(c)、puts(strputs(str)、7C语言程序设计-第5章 函数7.2 函数定义的一般形式函数定义的一般形式n n函数定义形式n n返回类型返回类型 函数名函数名(参数声明参数声明)声明部分声明部分 语句语句 n n返回类型、参数、函数体内容都可省略n ndummy()dummy(
6、)/*does nothing&returns nothing*/*does nothing&returns nothing*/8C语言程序设计-第5章 函数函数定义形式的说明函数定义形式的说明n n关于“返回类型”n n指函数返回值的类型指函数返回值的类型n n若省略此项,则认为返回类型是若省略此项,则认为返回类型是intintn n若无返回值,则定义返回类型为若无返回值,则定义返回类型为voidvoidn n关于“参数声明”n n类型类型 形参名形参名,类型类型 形参名形参名,.n n关于“声明部分”n n指变量、函数的声明指变量、函数的声明9C语言程序设计-第5章 函数函数定义举例函数定
7、义举例int max(int x,int y)int z;z=xy?x:y;return z;int min(int x,int y)return xy?x:y;10C语言程序设计-第5章 函数7.3 函数的参数和函数的值函数的参数和函数的值n n形式参数和实际参数n n形参:形参:定义定义函数时,函数名后函数时,函数名后()()中的参数中的参数n n实参:实参:调用调用函数时,函数名后函数时,函数名后()()中的参数中的参数n n实参可以是常量、变量、表达式、函数调用实参可以是常量、变量、表达式、函数调用n n实参和形参必须类型相同或赋值兼容实参和形参必须类型相同或赋值兼容11C语言程序设计
8、-第5章 函数#include#include intint max(intmax(int x,intx,int y)y)/*/*函数定义函数定义*/intint z;z;z=(x z=(xy)?x:yy)?x:y;return(zreturn(z););main()main()intint a,b,ca,b,c;scanf(%d%d,&a,&bscanf(%d%d,&a,&b););c=c=max(a,bmax(a,b););/*/*函数调用函数调用*/printf(maxprintf(max=%=%dn,cdn,c););【例】求两数的最大值。注意函数的定义形式。实际参数实际参数形式参数形
9、式参数12C语言程序设计-第5章 函数参数传递参数传递n n值传递n n实参对形参的数据传递是实参对形参的数据传递是“值传递值传递”n n单向传递n n只能把实参的值传递给形参只能把实参的值传递给形参n n不能把形参的值传递给实参不能把形参的值传递给实参n n对形参的值所作的改变不能带回给实参对形参的值所作的改变不能带回给实参n n实参和形参是不同的变量n n具有不同的存储空间具有不同的存储空间n n具有不同的生存期和作用域具有不同的生存期和作用域13C语言程序设计-第5章 函数参数传递举例参数传递举例void swap(int x,int y)int t;t=x,x=y,y=t;int ma
10、in()int a=1,b=4;swap(a,b);printf(“%d%d”,a,b);1a4b1x4y41结果:1 414C语言程序设计-第5章 函数参数传递举例参数传递举例int main()int n=100;printf(input numbern);s(n);printf(“main函数:函数:n=%dn,n);int s(int n)int i;for(i=n-1;i=1;i-)n=n+i;printf(“s函数:函数:n=%dn,n);输出:s函数:n=5050main函数:n=10015C语言程序设计-第5章 函数return语句语句n n形式n n形式一:形式一:retur
11、nreturn;n n形式二:形式二:returnreturn expressionexpression;n n功能n n函数返回语句函数返回语句n n结束函数调用结束函数调用n n如果需要,还可以带回函数返回值如果需要,还可以带回函数返回值16C语言程序设计-第5章 函数return语句执行图示:语句执行图示:main()main()intint a,b,ca,b,c;scanf(“%d%d”,&a,&bscanf(“%d%d”,&a,&b););c=c=max(a,bmax(a,b);printf(“maxprintf(“max=%=%dn”,cdn”,c););intint max(x,
12、ymax(x,y)intint x,yx,y;intint z;z;z=(x z=(xy)?x:yy)?x:y;return(zreturn(z););主调函数被调函数17C语言程序设计-第5章 函数函数的返回值函数的返回值(Return Value)n n返回值的说明返回值的说明1.1.函数返回值的类型在函数定义中指定函数返回值的类型在函数定义中指定2.2.函数返回值通过函数中的函数返回值通过函数中的returnreturn语句获得语句获得3.3.若函数无返回值,则可以没有若函数无返回值,则可以没有returnreturn语句语句4.4.returnreturn语句后的表达式类型,应与函数返
13、回值语句后的表达式类型,应与函数返回值类型相同,或可以兼容赋值;两者类型不同时,类型相同,或可以兼容赋值;两者类型不同时,自动做类型转换自动做类型转换5.5.函数需要返回值时,若缺少函数需要返回值时,若缺少returnreturn语句,或语句,或returnreturn语句未带返回值,则返回一个不确定值语句未带返回值,则返回一个不确定值18C语言程序设计-第5章 函数7.4 函数的调用函数的调用n n一般形式n n函数名函数名(实参表列实参表列)n n说明n n即使没有实参,即使没有实参,()()也不能省略也不能省略n n多个实参之间用逗号分隔多个实参之间用逗号分隔n n实参与形参按顺序一一对
14、应,类型应匹配实参与形参按顺序一一对应,类型应匹配n n实参的求值顺序不唯一,应避免对此敏感的调实参的求值顺序不唯一,应避免对此敏感的调用形式用形式printf(%d,%dprintf(%d,%d,i,i+);,i,i+);19C语言程序设计-第5章 函数函数调用的方式:函数调用的方式:1.1.函数语句函数语句n nprintf(%dnprintf(%dn,i);,i);2.2.函数表达式函数表达式n n(c+d*(c+d*max(a,bmax(a,b)%e)%e3.3.函数参数函数参数n ngcd(max(a,bgcd(max(a,b),),min(cmin(c,d),d)n n说明说明n
15、n函数调用可以看作同返回类型的表达式使用函数调用可以看作同返回类型的表达式使用n n同时,函数调用还完成了函数中定义的操作同时,函数调用还完成了函数中定义的操作20C语言程序设计-第5章 函数函数原型函数原型(Prototype)n n一般形式n n类型类型 函数名函数名(类型类型1,1,类型类型2,.);2,.);n n类型类型 函数名函数名(类型类型1 1 形参形参1,1,类型类型2 2 形参形参2,.);2,.);n n举例n nintint max(intmax(int,intint););n nintint max(intmax(int x,x,intint y);y);n nvoi
16、d dummy();void dummy();/*/*无参函数原型无参函数原型*/n nvoid void dummy(voiddummy(void););/*/*同上同上*/21C语言程序设计-第5章 函数函数的声明函数的声明(Declaration)n n函数声明的形式即函数原型n n在函数调用之前,应对函数进行声明n n函数声明可以在主调函数的声明部分,也可以在函数外部n n函数外部的声明,对所有主调函数都起作用,不需要在主调函数内再次声明n n函数的定义也具有声明的作用n n库函数的声明包括在头文件(*.h)里,不需在源程序里声明22C语言程序设计-第5章 函数int max(int
17、x,int y);/*函数声明*/函数声明举例函数声明举例(1)int main()_int a,b,c;c=max(a,b);int max(int x,int y)return xy?x:y;23C语言程序设计-第5章 函数函数声明举例函数声明举例(2)int max(int x,int y);/*函数声明*/int main()/*不需要再次声明int max(int,int)*/int a,b,c;c=max(a,b);int max(int x,int y)return xy?x:y;24C语言程序设计-第5章 函数函数声明举例函数声明举例(3)int max(int x,int y
18、)/*函数定义具有声明作用*/return xy?x:y;int main()/*不需要再次声明int max(int,int)*/int a,b,c;c=max(a,b);25C语言程序设计-第5章 函数7.5 函数的嵌套调用函数的嵌套调用n n调用一个函数的过程中,调用另一函数。调用一个函数的过程中,调用另一函数。main函数函数结束结束调用调用a函数函数b函数函数a函数函数调用调用b函数函数26C语言程序设计-第5章 函数函数嵌套调用的例子函数嵌套调用的例子int sum_class(int class);int sum_dept(int dept);int main()int i,dn
19、,sum;printf(“输入学院数输入学院数:”);scanf(“%d”,&dn);for(sum=0,i=1;i=dn;i+)sum=sum+sumdept(i);printf(“全校学费总金额全校学费总金额%dn”,sum);int sum_dept(int dept)int i,cn,s=0;printf(“输输%d学院班级学院班级数数”,dept);scanf(“%d”,&cn);for(i=1;i=cn;i+)s=s+sum_calss(i);return(s);int sum_class(int class)int i,student,s=0;printf(“输输%d班级人数班级
20、人数”,class);scanf(“%d”,&student);for(i=1;i1)(n1)29C语言程序设计-第5章 函数n n例例例例:用递归方法求用递归方法求用递归方法求用递归方法求n n!。!。!。!。n n!=1 n=0=1 n=0,1 1 n*(n-1)!n1 n*(n-1)!n1 6!-5!-4!-3!-2!-1!=1 (6!-5!-4!-3!-2!-1!=1 (已知条件已知条件已知条件已知条件)1!*2-2!*3-3!*4-4!*5-5!*6=720 1!*2-2!*3-3!*4-4!*5-5!*6=720 float float fac(intfac(int n)n)flo
21、at f;float f;if(nif(n=0|n=1)f=1;=0|n=1)f=1;else f=fac(n-1)*n;else f=fac(n-1)*n;return(freturn(f););main()main()intint n;float y;n;float y;scanf(“%d”,&nscanf(“%d”,&n););y=y=fac(nfac(n););printf(“%dprintf(“%d!=%10.2fn”,n,y);!=%10.2fn”,n,y);30C语言程序设计-第5章 函数【例例5】求最大公约数(递归)求最大公约数(递归)#include stdio.hint m
22、ain()int a,b,x;printf(“输入两个正整数输入两个正整数:);scanf(%d%d,&a,&b);if(a=0|b%-%cncn,x,z);,x,z);else else move(n-1,x,z,y);move(n-1,x,z,y);printf(%cprintf(%c-%-%cncn,x,z);,x,z);move(n-1,y,x,z);move(n-1,y,x,z);main()main()intint h;h;printf(ninputprintf(ninput number:n);number:n);scanf(%d,&hscanf(%d,&h););printf(
23、theprintf(the step to moving%2d step to moving%2d diskes:n,hdiskes:n,h););move(h,a,b,cmove(h,a,b,c););33C语言程序设计-第5章 函数7.7 数组与函数参数数组与函数参数l数组元素作为函数的实参数组元素作为函数的实参n n数数组组元元素素的的引引用用与与一一般般变变量量的的引引用用是是一一样样的的,传递的是数组元素的值,属于传递的是数组元素的值,属于“值传递值传递”方式。方式。n n例例:设设a8a8和和b8b8分分别别保保存存了了A A班班和和B B班班八八门门课课程程的的平平均均成成绩绩,
24、现现要要统统计计出出A A班班有有几几门门课课程程的的平平均成绩高于均成绩高于B B班班34C语言程序设计-第5章 函数intintintint better(floatbetter(floatbetter(floatbetter(float ave1,float ave2)ave1,float ave2)ave1,float ave2)ave1,float ave2)if(ave1ave2)if(ave1ave2)if(ave1ave2)if(ave1ave2)return(1);return(1);return(1);return(1);else return(-1);else retur
25、n(-1);else return(-1);else return(-1);main()main()intintintint i,ki,ki,ki,k=0;float=0;float=0;float=0;float a8=65,78,67,90,84,63,58,76,b8=6a8=65,78,67,90,84,63,58,76,b8=6a8=65,78,67,90,84,63,58,76,b8=6a8=65,78,67,90,84,63,58,76,b8=62,79,65,88,80,65,60,74;2,79,65,88,80,65,60,74;2,79,65,88,80,65,60,74
26、;2,79,65,88,80,65,60,74;for(ifor(ifor(ifor(i=0;i8;i+)=0;i8;i+)=0;i8;i+)=0;i0)k=k+1;)0)k=k+1;)0)k=k+1;)0)k=k+1;printf(printf(printf(printf(%dn%dn%dn%dn,k,k,k,k););););35C语言程序设计-第5章 函数l数组名作为函数的实参nC语言中的数组名代表了数组在内存中存放的起始地址,所以数组名作为函数的参数传递的是数数组组的的起起始始地地址址,属于“传地址”。n说明:(1)用数组名作为函数的参数,必须对实参数组先定义,形参必须说明成与实参数组
27、类型一致的数组。(2)形参数组和实参数组的数组名可以不一样,数组的大小也可以不一致。由于传递的是地址,所以形参数组和实参数组在内存中实际上是共用了连续的一块地址空间共用了连续的一块地址空间。36C语言程序设计-第5章 函数 n n用函数用函数用函数用函数average()average()average()average()求求求求30303030个学生英语课的平均成绩。个学生英语课的平均成绩。个学生英语课的平均成绩。个学生英语课的平均成绩。float float float float average(average(average(average(intintintint mark,mar
28、k,mark,mark,intintintint n)n)n)n)float float float float aveaveaveave;intintintint sum=0,i;sum=0,i;sum=0,i;sum=0,i;for(ifor(ifor(ifor(i=0;i=0;i=0;i=0;in;in;in;in;i+)+)+)+)sum=sum=sum=sum=sum+markisum+markisum+markisum+marki;aveaveaveave=sum/n;=sum/n;=sum/n;=sum/n;return(avereturn(avereturn(avereturn
29、(ave););););main()main()main()main()intintintint i,i,i,i,score30score30score30score30;printfprintfprintfprintf(请输入请输入请输入请输入30303030个学生的英语成绩:个学生的英语成绩:个学生的英语成绩:个学生的英语成绩:nnnn);for(ifor(ifor(ifor(i=0;i30;i+)=0;i30;i+)=0;i30;i+)=0;i30;i+)scanf(scanf(scanf(scanf(%d%d%d%d,&scorei,&scorei,&scorei,&scorei);)
30、;););printf(printf(printf(printf(%5.1fn%5.1fn%5.1fn%5.1fn,average(score,30);,average(score,30);,average(score,30);,average(score,30);37C语言程序设计-第5章 函数例例 intint swap(intswap(int a)a)intint t;t;t=a0;a0=a1;a1=t;t=a0;a0=a1;a1=t;intint main()main()intint array2=0,1;array2=0,1;printf(“%dprintf(“%d,%dn”,arr
31、ay0,array1);,%dn”,array0,array1);swap(arrayswap(array););printf(“%dprintf(“%d,%dn”,array0,array1);,%dn”,array0,array1);结果:结果:0,11,038C语言程序设计-第5章 函数多维数组名作函数参数多维数组名作函数参数#include#include void void printArray(intprintArray(int array4);array4);/*/*函数声明函数声明函数声明函数声明*/intint main()main()intint array34=0,1,2
32、,3,4,5,6,7,8,9,10,11;array34=0,1,2,3,4,5,6,7,8,9,10,11;printArray(arrayprintArray(array););return 0;return 0;void void printArray(intprintArray(int array4)array4)/*/*函数定义函数定义函数定义函数定义*/intint i,j;i,j;for(ifor(i=0;i3;i+)=0;i3;i+)for(jfor(j=0;j4;j+)=0;j4;j+)printf(%2d,printf(%2d,arrayijarrayij););print
33、f(nprintf(n););39C语言程序设计-第5章 函数例:求例:求5x5数组鞍点数组鞍点intint max_in_rowmax_in_row(intint row,row,intint colcol,intint a 5)a 5)intint j,vj,v;for(jfor(j=0,v=0,v=arowcolarowcol;j5;j+);jv)break;v)break;if(jif(j=5)return(1);else return(0);=5)return(1);else return(0);intint min_in_col(intmin_in_col(int row,row,
34、intint colcol,intint a 5)a 5)intint i,v;i,v;for(ifor(i=0,v=0,v=arowcolarowcol;i5;i5;i+i+)if(aicolif(aicolv)break;y?x:y;int c;/*全局变量*/int main()int a=8;c=max(a,b);/*引用局部变量a*/全局变量全局变量c作用域作用域全局变量全局变量a,b,x,y作用域作用域局部变量局部变量a作用域作用域形参形参x,y作用域作用域46C语言程序设计-第5章 函数局部变量和全局变量局部变量和全局变量【例例】#include int a,b;int main
35、()int c;c=max();printf(“the bigger of%d and%d:%dn,a,b,c);int max()if(ab)return(a);else return(b);int max()c=(ab)?a:b;return c;47C语言程序设计-第5章 函数7.9 变量的存储类型变量的存储类型n n动态存储方式动态存储方式n n程序运行期间根据需要动态分配存储空间程序运行期间根据需要动态分配存储空间n n函数形参、自动变量等函数形参、自动变量等n n每次调用函数时,给该函数中的局部变量和形参分配每次调用函数时,给该函数中的局部变量和形参分配存储空间,函数返回后释放空间
36、存储空间,函数返回后释放空间n n静态存储方式静态存储方式n n程序运行期间分配固定的存储空间程序运行期间分配固定的存储空间n n全局变量全部存放在静态存储区中全局变量全部存放在静态存储区中 动态存储方式和静态存储方式动态存储方式和静态存储方式动态存储方式和静态存储方式动态存储方式和静态存储方式48C语言程序设计-第5章 函数变量的存储类型变量的存储类型n n自动变量auton n寄存器变量registern n静态变量staticn n外部变量extern49C语言程序设计-第5章 函数自动自动(auto)变量变量n nauto变量n n局部变量,用局部变量,用autoauto关键字修饰关键
37、字修饰n nautoauto可以省略,是缺省的存储方式可以省略,是缺省的存储方式n n自动分配和释放存储空间自动分配和释放存储空间n n举例int foo(int x)auto int a,b,c=6;/*定义自动变量a,b,c*/float f,g=0.1;/*定义自动变量f,g*/50C语言程序设计-第5章 函数寄存器寄存器(register)变量变量n nregister变量n n存放在存放在CPUCPU寄存器中,存取速度快寄存器中,存取速度快n n寄存器变量只能动态分配存储空间寄存器变量只能动态分配存储空间(寄存器寄存器)n n只有自动变量和形参可以作为寄存器变量只有自动变量和形参可以
38、作为寄存器变量n n举例int foo(int x)register int i;/*定义寄存器变量i*/for(i=0;i10000;i+)./*i用于循环变量*/51C语言程序设计-第5章 函数静态静态(static)局部变量局部变量n n静态局部变量n n局部变量,用局部变量,用staticstatic关键字修饰关键字修饰n n静态局部变量为静态局部变量为静态存储静态存储,整个程序运行期间,整个程序运行期间都不释放,其值不会丢失都不释放,其值不会丢失n n在函数调用结束后,静态局部变量虽仍然存在,在函数调用结束后,静态局部变量虽仍然存在,但已经不在变量的作用域内,所以其他函数不但已经不在
39、变量的作用域内,所以其他函数不能引用它能引用它n n静态局部变量在编译时赋初值,且只赋一次静态局部变量在编译时赋初值,且只赋一次n n若不对静态局部变量赋初值,则初值为若不对静态局部变量赋初值,则初值为0 052C语言程序设计-第5章 函数静态局部变量举例静态局部变量举例int f(int a)int b=0;static int c=3;b+;c+;return a+b+c;int main()int x=2,i;for(i=0;iy?x:y;int main()extern A,B;/*extern声明外部变量*/printf(%d,max(A,B);/*在定义之前使用外部变量*/int
40、A=13,B=-8;/*定义外部变量*/55C语言程序设计-第5章 函数非静态外部变量举例非静态外部变量举例(2)/*file1.c*/*声明外部变量*/extern A,B;extern max(int,int);int main()int c;c=max(A,B);printf(%d,c);/*file2.c*/*定义外部变量*/int A=13,B=-8;int max(int x,int y)int z;z=xy?x:y;return z;56C语言程序设计-第5章 函数用用static声明外部变量声明外部变量n n静态外部变量n n限制外部变量只能被本文件引用限制外部变量只能被本文件
41、引用n n静态外部变量不能被其他文件引用静态外部变量不能被其他文件引用n n举例/*file1.c*/static int A;main()./*file2.c*/extern int A;void foo(int n)A=A*n;不能引用静态不能引用静态外部变量外部变量A57C语言程序设计-第5章 函数变量的声明和定义变量的声明和定义n n声明(Declaration)n n对变量的某些属性加以说明对变量的某些属性加以说明n n定义(Definition)n n定义一个新的变量,并分配存储空间定义一个新的变量,并分配存储空间n n定义有声明的功能,但声明不一定都是定义定义有声明的功能,但声明
42、不一定都是定义n n举例int main()extern A;/*声明而非定义,声明A为已定义外部变量*/.int A;/*定义A为整型外部变量*/58C语言程序设计-第5章 函数从作用域角度分类从作用域角度分类n n局部变量n n自动变量自动变量(离开函数,值就消失离开函数,值就消失)n n寄存器变量寄存器变量(离开函数,值就消失离开函数,值就消失)n n形式参数形式参数(可为自动或寄存器变量可为自动或寄存器变量)n n静态局部变量静态局部变量(离开函数,值仍保留离开函数,值仍保留)n n全局变量n n静态外部变量静态外部变量(只限本文件引用只限本文件引用)n n非静态外部变量非静态外部变量
43、(允许其他文件引用允许其他文件引用)59C语言程序设计-第5章 函数从生存期角度分类从生存期角度分类n n动态存储n n自动变量自动变量(本函数内有效本函数内有效)n n寄存器变量寄存器变量(本函数内有效本函数内有效)n n形式参数形式参数(本函数内有效本函数内有效)n n静态存储n n静态局部变量静态局部变量(本函数内有效本函数内有效,存储单元一直存在,存储单元一直存在)n n静态外部变量静态外部变量(本文件内有效本文件内有效)n n非静态外部变量非静态外部变量(其他文件可以引用其他文件可以引用)60C语言程序设计-第5章 函数从存放位置角度分类从存放位置角度分类n n内存动态存储区n n自
44、动变量自动变量n n形式参数形式参数n n内存静态存储区n n静态局部变量静态局部变量n n静态外部变量静态外部变量(本文件内有效本文件内有效)n n非静态外部变量非静态外部变量(其他文件可以引用其他文件可以引用)n nCPU中的寄存器n n寄存器变量寄存器变量61C语言程序设计-第5章 函数变量作用域和生存期小结变量作用域和生存期小结变量存储类型变量存储类型函数内函数内函数外函数外作用域作用域生存期生存期作用域作用域生存期生存期自动变量自动变量 形式参数形式参数寄存器变量寄存器变量静态局部变量静态局部变量 静态外部变量静态外部变量 非静态外部变量非静态外部变量 只限本文件只限本文件 其他文件
45、也可以引用其他文件也可以引用62C语言程序设计-第5章 函数内部函数与外部函数内部函数与外部函数n n定义形式n nstatic static 类型类型 函数名函数名(形参表形参表)n n说明n n内部函数又称静态函数内部函数又称静态函数n n内部函数只能在所在文件中使用内部函数只能在所在文件中使用n n类似于静态外部变量的作用范围类似于静态外部变量的作用范围n n举例n nstatic static intint foo(intfoo(int a,a,intint b);b);内部函数内部函数63C语言程序设计-第5章 函数外部函数外部函数外部函数外部函数n n定义形式n nextern e
46、xtern 类型类型 函数名函数名(形参表形参表)n n说明n n可以在其他文件中调用可以在其他文件中调用n nexternextern关键字在定义时可以省略关键字在定义时可以省略n n需要调用该函数的文件中,用需要调用该函数的文件中,用externextern声明声明该函数是外部定义的该函数是外部定义的n n举例n nextern extern intint foo(intfoo(int a,a,intint b);b);64C语言程序设计-第5章 函数各种变量和关键字用法总结各种变量和关键字用法总结n n自动变量、形参、寄存器变量用法相同n n寄存器变量存放在寄存器变量存放在CPUCPU中
47、,但不影响用法中,但不影响用法n n所有外部变量都是静态存储的n n不管是不是不管是不是staticstatic的外部变量的外部变量n nstatic关键字的意义n n静态局部变量,表示静态局部变量,表示“静态存储静态存储”n n静态外部变量和函数,表示静态外部变量和函数,表示只能用于本文件只能用于本文件n n非静态外部变量和函数,表示非静态外部变量和函数,表示其他文件可以引其他文件可以引用用,外部引用时用,外部引用时用externextern加以声明加以声明65C语言程序设计-第5章 函数作业:page 218:1(写出两种方法),4,10 实验:page 160:2,7,+作业homewo
48、rk程序66C语言程序设计-第5章 函数结束结束The End67C语言程序设计-第5章 函数实验中的问题实验中的问题n n函数形参f(float x,float y)f(float x,float y)float z;float z;z=z=pow(x,ypow(x,y););return(z);return(z);n n错误写法f(float x,float y)f(float x,float y)/形参形参x x,y y float x,y,z;float x,y,z;/新定义变量新定义变量x,yx,y z=z=pow(x,ypow(x,y););return(z);return(z);
49、不同!不同!xyzxyzxy存储空间存储空间68C语言程序设计-第5章 函数实验中的问题实验中的问题n n数组名作函数参数 n n实参和形参均可使实参和形参均可使用数组名用数组名n n传地址传地址n n通过通过【下标下标】引用引用元素元素n n 数组元素作函数实参n n如同普通变量做实参如同普通变量做实参n n形参定义成相应类型形参定义成相应类型的变量而不是数组的变量而不是数组n n传值传值69C语言程序设计-第5章 函数n nscanf(“%d”,a);/&an nif(i=0)/i=0n nfor(i=0;iN;i+);/;使for循环成了空语句 s=s*ai;70C语言程序设计-第5章
50、函数建议:建议:1.1.大括号的位置大括号的位置 :该块的最左侧:该块的最左侧2.2.语句块缩进:缩进的大小是为了清楚的表明一个块语句块缩进:缩进的大小是为了清楚的表明一个块的开始和结束的开始和结束 ,通常缩进,通常缩进2-82-8格格3.3.有意义的标识符有意义的标识符 4.4.适当的注释适当的注释养成良好的程序书写格式养成良好的程序书写格式:语句挤成一堆可以节省半纸,然后可能需要用两张纸来修改程序。语句挤成一堆可以节省半纸,然后可能需要用两张纸来修改程序。语句挤成一堆可以节省半纸,然后可能需要用两张纸来修改程序。语句挤成一堆可以节省半纸,然后可能需要用两张纸来修改程序。缺点:影响编程效率和