C语言程序设计-第08章函数_第1页
C语言程序设计-第08章函数_第2页
C语言程序设计-第08章函数_第3页
C语言程序设计-第08章函数_第4页
C语言程序设计-第08章函数_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、(2)有参函数的一般形式)有参函数的一般形式函数类型函数类型 函数名函数名( 数据类型数据类型 参数,数据类型参数,数据类型 参数参数2) 说明语句部分;说明语句部分; 可执行语句部分;可执行语句部分;有参函数比无参函数多了一个参数表。调用有参有参函数比无参函数多了一个参数表。调用有参函数时,调用函数将赋予这些参数实际的值。函数时,调用函数将赋予这些参数实际的值。int max(int x,int y)int z ;z=xy?x:y; return(z);为了与调用函数提供的实际参数区别开,将函数为了与调用函数提供的实际参数区别开,将函数定义中的参数表称为形式参数表,简称形参表。定义中的参数表

2、称为形式参数表,简称形参表。 7,8 (输入)(输入)Max is 82函数类型函数类型在定义函数时,对函数类型的说明,应与在定义函数时,对函数类型的说明,应与return语句中、返回值表达式的类型一致。语句中、返回值表达式的类型一致。如果不一致,则以函数类型为准。如果缺省函数如果不一致,则以函数类型为准。如果缺省函数类型,则系统一律按整型处理。类型,则系统一律按整型处理。良好的程序设计习惯良好的程序设计习惯:为了使程序具有良好的可:为了使程序具有良好的可读性并减少出错,凡不要求返回值的函数都应定义为读性并减少出错,凡不要求返回值的函数都应定义为空类型;即使函数类型为整型,也不使用系统的缺省空

3、类型;即使函数类型为整型,也不使用系统的缺省处理。处理。说明说明:(1 1)调用函数时,函数名称必须与具有该功能的自定义函)调用函数时,函数名称必须与具有该功能的自定义函数名称完全一致。数名称完全一致。(2 2)实参在类型上按顺序与形参,必须一一对应和匹配。)实参在类型上按顺序与形参,必须一一对应和匹配。如果类型不匹配,如果类型不匹配,C C编译程序将按赋值兼容的规则进行转换。如编译程序将按赋值兼容的规则进行转换。如果实参和形参的类型不赋值兼容,通常并不给出出错信息,且果实参和形参的类型不赋值兼容,通常并不给出出错信息,且程序仍然继续执行,只是得不到正确的结果。程序仍然继续执行,只是得不到正确

4、的结果。(3 3)如果实参表中包括多个参数,对实参的求值顺序随系)如果实参表中包括多个参数,对实参的求值顺序随系统而异。有的系统按自左向右顺序求实参的值,有的系统则相统而异。有的系统按自左向右顺序求实参的值,有的系统则相反。反。Turbo CTurbo C和和MS CMS C是按自右向左的顺序进行的是按自右向左的顺序进行的 。计算计算1到到n的的k次方之累加和次方之累加和long f2(int n,int k) long sum=0; int i; for(i=1;i1) f=power(n-1)*n; else f=1; return(f); 一、数组元素作函数是实参数例8.10 有两个数组

5、a, b 各有10个数,将它们对应地逐个相比。分别统计出两个数组相应元素大于、等于、小于的次数。程序如下: cccccmain( )int large(int x,int y);int a10,b10,I,n=0,m=0,k=0;printf(“enter a:n”);for(I=0;I10;I+) scanf(;%d”,&aI);printf(“n”);printf(“enter b:n”); for(I=0;I10;I+) scanf(;%d”,&aI);printf(“n”);printf(“enter b:n”);for(I=0;I10;I+) scanf(“%d”,&bI);prin

6、tf(“n”);for(I=0;Ib%d na=b %dn ak) printf(“is bn”);else if(ny) flag=1;else if(xb 4a=b 1ab 5说明说明:(1 1)用数组名作函数参数,应该在调用函数和被调)用数组名作函数参数,应该在调用函数和被调用函数中分别定义数组,且数据类型必须一致,否则结用函数中分别定义数组,且数据类型必须一致,否则结果将出错。例如,在本案例中,形参数组为果将出错。例如,在本案例中,形参数组为aa,实参数,实参数组为组为scosco,它们的数据类型相同。,它们的数据类型相同。(2 2)C C编译系统对形参数组大小不作检查,所以形编译系统

7、对形参数组大小不作检查,所以形参数组可以不指定大小。例如,本案例中的形参数组参数组可以不指定大小。例如,本案例中的形参数组aa。 如果指定形参数组的大小,则实参数组的大小必须如果指定形参数组的大小,则实参数组的大小必须大于等于形参数组,否则因形参数组的部分元素没有确大于等于形参数组,否则因形参数组的部分元素没有确定值而导致计算结果错误。定值而导致计算结果错误。8.8 局部变量和全局变量局部变量和全局变量 一、局部变量一、局部变量只有在本函数内才能使用的变量,称为局部变量。只有在本函数内才能使用的变量,称为局部变量。如:如:float f1(int a) int b,c; 说明:说明:1)主函数

8、中定义的变量也是只能在主函数中有效,主函数中定义的变量也是只能在主函数中有效, 而不因为在主函数中定义而在整个文件或程序中而不因为在主函数中定义而在整个文件或程序中 有效,这是和有效,这是和PASCAL 不同的。不同的。 2) 不同函数中可以使用相同名字的变量,它们代表不同不同函数中可以使用相同名字的变量,它们代表不同 的对象,互不干扰。的对象,互不干扰。 3) 形式参数也是局部变量形式参数也是局部变量,其他函数不能调用。其他函数不能调用。 在一个在一个 函数内部,可以在复合语句中定义变量,这些变量函数内部,可以在复合语句中定义变量,这些变量 只在本复合语句中有效。这种复合语句也称为只在本复合

9、语句中有效。这种复合语句也称为 “分程序分程序”或或“程序块程序块”。二、全局变量二、全局变量在函数内定义的变量是局部变量,在函数内定义的变量是局部变量,而在函数之外定义的变量而在函数之外定义的变量称为外部变量,就是全局变量。称为外部变量,就是全局变量。供本文件中其他函数所共用。供本文件中其他函数所共用。如:如: int p=1,q=5; /* 外部变量外部变量*/ float f1(a) int a; int b,c; char c1,c2; /* 外部变量外部变量*/ char f2(int x,int y) int i,j; main( )int n,m;8.9 变量的存储类别变量的存储

10、类别 一、动态存储方式与静态存储方式一、动态存储方式与静态存储方式所谓静态存储方式是指在程序运行期间,分配固定的存储所谓静态存储方式是指在程序运行期间,分配固定的存储空间的方式。空间的方式。而动态存储方式则是在程序运行期间,根据需要进行动态而动态存储方式则是在程序运行期间,根据需要进行动态的分配空间的方式。的分配空间的方式。存储空间分为三部分:存储空间分为三部分:1、 程序区程序区2、 静态存储区静态存储区3、 动态存储区动态存储区全局变量全部存储在静态存储区中。全局变量全部存储在静态存储区中。动态存储区中存放:动态存储区中存放: 1)函数形参)函数形参 2)自动变量)自动变量 3)函数返回时

11、的现场保护和返回地址等)函数返回时的现场保护和返回地址等 存储类别指的是数据在内存中存储的方法。存储类别指的是数据在内存中存储的方法。 在语言中,对变量的存储类型说明有以下四种:在语言中,对变量的存储类型说明有以下四种: 1 . 1 . 自动变量自动变量(auto)(auto)2 . 2 . 寄存器变量寄存器变量(register)(register)3 . 3 . 外部变量外部变量(extern)(extern)4 . 4 . 静态变量静态变量(static)(static)自动变量和寄存器变量属于动态存储方式,外部变量和静态自动变量和寄存器变量属于动态存储方式,外部变量和静态内部变量属于静

12、态存储方式。内部变量属于静态存储方式。二、二、auto 变量变量局部变量称为自动变量。用局部变量称为自动变量。用auto 作存储类别声明。作存储类别声明。例如:例如:int f(int a) auto int b,c=3; 实际上关键字实际上关键字auto 可以省略,属于动态存储方式。可以省略,属于动态存储方式。 三三、用用static声明局部变量声明局部变量当希望调用结束后不消失而保留原值,占用单元不释放,这时应指定该局部变量为“静态局部变量”, 用static声明。例817 考察静态变量的值。程序如下:程序如下: f(int a) main( ) auto b=0; int n=2,i;

13、for(i=0;i3;i+) b=b+1; printf(static c=3; %d”,f(a); c=c+1; 行结果:行结果: 7 8 9 return(a+b+c); 运运四、register 变量C语言允许将局部变量的值放在CPU的寄存器中,需要时直接取出来参加运算,不必到内存中去存取。这种变量就叫做“寄存器变量”。用关键字register 声明。例8、19 使用寄存器变量求5!程序如下:int fac(int n) main( ) register int i,f=1; int i;for(i=1;i=n;i+) for(i=1;iy? x:y;return(z); main( )

14、extern A,B;printf(“%d”,max(A,B); int A=13,B=-8; /*定义外部变量*/ 运行结果如下: 13六、用 static声明外部变量只限于本文件使用,而不能被其他文件引用。例如:filel.c flel.cstatic int A; exrtern int A;main( ) fun (int a) A=A*n; 七、关于变量的声明和定义函数的声明是函数的原型,而函数的定义是函数的本身。在声明部分出现的变量有两种情况:1)一种是需要建立存储空间的2)另一种是不需要建立存储空间的例如:“int a;” /* 既是声明又是定义*/“extern a;” /*它

15、是声明而不是定义,声明a 是一个已经定义的外部变量*/一般把建立存储空间的声明称为定义,而把不需要建立存储空间的声明称为声明。八、存储类别小结 1) 从作用域角度分:局部量 全局量2) 从变量存在的时间来分:动态存储 静态存储 8.10 内部函数和外部函数内部函数和外部函数 一、 内部函数如果一个函数只能被本文件中其他函数所调用,称为内部函数。(也称静态函数)在定义前加static二、 外部函数1) 在定义时,如果首部左端冠以extern ,则表明是 外部函数,可供其它文件调用。2) 在需要调用此文件中用extern声明所用的函数是外部 函数。 8.11 如何运行一个多文件的程序一、 使用 T

16、urbo C 集成环境1)先输入并编辑4个文件,分别以文件 file1.C ,file2.C ,file3.C ,file4.C 存储在磁盘上。2)在编辑状态下,建立一个“项目文件”, 它不包括任何程序语句,而只包括组成程序的 所有的文件名即:file1.Cfile2.Cfile3.Cfile4.C 扩展名可以省略.C ,也可以写在同一行上: file3 file1 file2 file4如果这些源文件不在当前目录下,应指出路径。 案例案例8.9 输入长方体的长(l)、宽(w)、高(h),求长方体体积及正、侧、顶三个面的面积。功能:利用全局变量计算长方体的体积及三个面的面积int s1,s2,

17、s3;int vs(int a,int b,int c) int v; v=a*b*c; s1=a*b; s2=b*c; s3=a*c;return v; main() int v,l,w,h; clrscr(); printf(ninput length,width and height: ); scanf(%d%d%d,&l,&w,&h); v=vs(l,w,h); printf(v=%d s1=%d s2=%d s3=%dn,v,s1,s2,s3); getch(); 2 2动态存储动态存储自动局部变量(又称自动变量)自动局部变量(又称自动变量)(1 1)定义格式)定义格式:auto a

18、uto 数据类型数据类型 变量表;变量表;(2 2)存储特点)存储特点a a)自动变量属于动态存储方式。在函数中定义的自动变)自动变量属于动态存储方式。在函数中定义的自动变量,只在该函数内有效;函数被调用时分配存储空间,调用量,只在该函数内有效;函数被调用时分配存储空间,调用结束就释放。结束就释放。在复合语句中定义的自动变量,只在该复合语句中有效;在复合语句中定义的自动变量,只在该复合语句中有效;退出复合语句后,也不能再使用,否则将引起错误。退出复合语句后,也不能再使用,否则将引起错误。b b)定义而不初始化,则其值是不确定的。如果初始化,)定义而不初始化,则其值是不确定的。如果初始化,则赋初

19、值操作是在调用时进行的,且每次调用都要重新赋一则赋初值操作是在调用时进行的,且每次调用都要重新赋一次初值。次初值。c c)由于自动变量的作用域和生存期,都局限于定义它的)由于自动变量的作用域和生存期,都局限于定义它的个体内(函数或复合语句),因此不同的个体中允许使用同个体内(函数或复合语句),因此不同的个体中允许使用同名的变量而不会混淆。即使在函数内定义的自动变量,也可名的变量而不会混淆。即使在函数内定义的自动变量,也可与该函数内部的复合语句中定义的自动变量同名。与该函数内部的复合语句中定义的自动变量同名。建议:建议:系统不会混淆,并不意味着人也不会混淆,所以尽系统不会混淆,并不意味着人也不会

20、混淆,所以尽量少用同名自动变量!量少用同名自动变量! 3寄存器存储寄存器存储寄存器变量一般情况下,变量的值都是存储在内存中的。为提高执行效率,语言允许将局部变量的值存放到寄存器中,这种变量就称为寄存器变量。定义格式如下: register 数据类型数据类型 变量表;变量表;(1)只有局部变量才能定义成寄存器变量,即全局变量不行。(2)对寄存器变量的实际处理,随系统而异。例如,微机上的MSC和TC 将寄存器变量实际当作自动变量处理。(3)允许使用的寄存器数目是有限的,不能定义任意多个寄存器变量。静态局部变量和静态外部变量同属静态存储方式,但两者区静态局部变量和静态外部变量同属静态存储方式,但两者

21、区别较大:别较大:(1 1)定义的位置不同。静态局部变量在函数内定义,静态外)定义的位置不同。静态局部变量在函数内定义,静态外部变量在函数外定义。部变量在函数外定义。(2 2)作用域不同。静态局部变量属于内部变量,其作用域仅)作用域不同。静态局部变量属于内部变量,其作用域仅限于定义它的函数内;虽然生存期为整个源程序,但其它函数是限于定义它的函数内;虽然生存期为整个源程序,但其它函数是不能使用它的。不能使用它的。静态外部变量在函数外定义,其作用域为定义它的源文件内;静态外部变量在函数外定义,其作用域为定义它的源文件内;生存期为整个源程序,但其它源文件中的函数也是不能使用它的。生存期为整个源程序,

22、但其它源文件中的函数也是不能使用它的。 (3 3)初始化处理不同。静态局部变量,仅在第)初始化处理不同。静态局部变量,仅在第1 1次调用次调用它所在的函数时被初始化,当再次调用定义它的函数时,不再初它所在的函数时被初始化,当再次调用定义它的函数时,不再初始化,而是保留上始化,而是保留上1 1次调用结束时的值。而静态外部变量是在函次调用结束时的值。而静态外部变量是在函数外定义的,不存在静态内部变量的数外定义的,不存在静态内部变量的“重复重复”初始化问题,其当初始化问题,其当前值由最近前值由最近1 1次给它赋值的操作决定。次给它赋值的操作决定。 务必牢记务必牢记:把局部变量改变为静态内部变量后,:

23、把局部变量改变为静态内部变量后,改变了它的存储方式,即改变了它的生存期。把外部改变了它的存储方式,即改变了它的生存期。把外部变量改变为静态外部变量后,改变了它的作用域,限变量改变为静态外部变量后,改变了它的作用域,限制了它的使用范围。因此,关键字制了它的使用范围。因此,关键字“static”static”在不同在不同的地方所起的作用是不同的。的地方所起的作用是不同的。 8.10 内部函数和外部函数内部函数和外部函数 内部函数(又称静态函数)内部函数(又称静态函数) 外部函数外部函数 多个源程序文件的编译和连接多个源程序文件的编译和连接 当一个源程序由多个源文件组成时,语言根据函数当一个源程序由

24、多个源文件组成时,语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。外部函数。 内部函数(又称静态函数)内部函数(又称静态函数)如果在一个源文件中定义的函数,只能被本文件中的函数调如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。部函数。定义一个内部函数,只需在函数类型前再加一个定义一个内部函数,只需在函数类型前再加一个“static”关关键字即可,如下所示:键字即可,如下所示:static 函数类型函

25、数类型 函数名函数名(函数参数表函数参数表) 关键字关键字“static”,译成中文就是,译成中文就是“静态的静态的”,所以内部函数,所以内部函数又称静态函数。但此处又称静态函数。但此处“static”的含义不是指存储方式,而是指的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。对函数的作用域仅局限于本文件。使用内部函数的好处是:不同的人编写不同的函数时,不用使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。名也没有关系。 外部函数外部函数外部函数的定义:在定

26、义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数:extern 函数类型函数类型 函数名函数名(函数参数表函数参数表) 调用外部函数时,需要对其进行说明:extern 函数类型函数类型 函数名函数名(参数类型表参数类型表),函数名,函数名2(参数类型表参数类型表2);案例案例8.11 外部函数应用。(1)文件mainf.cmain() extern void input(),process(),output(); input(); process(); output(); (2)文件)文件subf1.cextern void input()/*定义外部函数定义外部函数*/ (3)文件)文件subf2.cextern void process()/*定义外部函数定义外部函数*/ (4)文件)文件subf3.cextern void output()/*定义外部函数定义外部函数*/ 多个源程序文件的编译和连接多个源程序文件的编译和连接 (1)一般过程编辑各源文件 创建Project(项目)文件 设置项目名称 编译、连接,运行,查看结果。(2)创建P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论