《函数定义的形式(C语言)》由会员分享,可在线阅读,更多相关《函数定义的形式(C语言)(25页珍藏版)》请在金锄头文库上搜索。
1、第八章 函数1、概 述2、函数定义的形式3、函数的参数5、函数的调用4、函数的值7、变量的作用范围8、函数的存储类别9、内部函数和外部函数 *10、多文件的程序的运行 *6、数组作为函数参数概 述(1)一件事情往往要实现多个功能一个程序多个函数一个C程序可由一个主函数和若干个函数构成。main a b c d e f g h h i e g 概 述(2)由主函数调用其他函数,其他函数也可以互相 调用。同一个函数可以被一个或多个函数调用任意多 次。i print_star( ) printf( “* * * * * * * * * * * * * * * * * *” ); 概 述(3)* *
2、* * * * * * * * * * * * * * * How do you do! * * * * * * * * * * * * * * * * *print_message( ) printf( “nHow do you do ! n” ); main( ) printstar( ); /* 调用printstar函数 */ print_message( ); /* 调用print_message函数 */ printfstar( ); /* printstar函数 */ 关于函数调用的几点说明1、一个源程序文件由一个或者多个函数组成。 一个源程序文件是一个编译单位,而不是以函数为单
3、位进行编译. 2、一个C程序由一个或者多个源文件组成。 3、C程序的执行从main函数开始,调用其它函数后,流程回到main 函数。4、所有的函数都是平行的,即在定义函数时是互相独立的,一个函 数并不从属于另一个函数,即函数不能嵌套定义,函数间可以互相 调用,但是不能调用main函数. 5、从用户使用的角度看,函数有两种: 标准函数和用户自己定义的函数.6、从函数的形式看,函数有两种: 无参函数和有参函数.2、 有参函数的定义形式 类型标识符 函数名(形式参数表列) 声明部分 语句 函 数 定 义 的 形 式(1)1、 无参函数的定义形式类型标识符 函数名() 声明部分语句int max( i
4、nt x,int y ) int z ;z = x y ? x : y ;return( z ) ; 函数类型 函数名(参数类型 参数名, , 参数类型 参数名)print_message( ) printf( “How do you do ! n” ); 关 于 定 义 的 说 明(1)1、max为函数名,括号中有两个形式参数x和 y,均是整型。在调用时,主调函数把实参的值传递给被调用函数max中的形参x和y,这时x和y才获得相应的存储单元。其本质是进行值的复制.2、花括弧内是函数体,它包括声明部分和语句部分。在声明部分定义函数中所用的变量(局部变量)。int max( int x , in
5、t y ) int z ;z = x y ? x : y ;return( z ) ; 关 于 定 义 的 说 明(2)3、在语句部分中求解,return(z)的作用是将z的值作为整个函数的值带回到主调函数,return后面括号中的值z就是函数带回的值即函数返回值。在函数定义时已指定max函数为整型,在函数体中也定义z为整型,二者达到一致。4、如果在定义函数时不指定函数类型,系统会隐含指定函数类型为int型。因此上面定义的max函数左端的int可以省写。max( int x,int y ) int z ;z = x y ? x : y ;return( z ) ; 函 数 参 数(1)形式参数
6、 和 实际参数在调用函数时,大多数情况下,主调函数和被调用函数 之间有数据传递关系。这就是前面提到的有参函数。在定义函数时函数后面括弧中的变量名称为“形式参数”( 简称“形参”),int max( int x , int y )在主调函数中调用一个函数时,函数名后面括弧中的 参数(可以是一个表达式)称为“实际参数”(简称“实 参”), c = max( a , b )。例(2)例8.2 调用函数时的数据传递 通过函调用,使两个函数中的变量发生联系.main( ) int a,b,c; scanf(“%d,%d”, c=max(a,b); printf(“Max is %d”,c); int m
7、ax(int x,int y) int z; z=xy?x:y; return (z); abc=max(a,b);说 明(1)(5) 实参变量对形参变量的数据传递“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参.在内存中,实参单元与形参单元是不同单元。2xa 23yb 33xa 22yb 3swap(int x,int y) int t; t=x;x=y;y=t; main() int a=2,b=3; if(ay?x:y); 注意:(1)一个函数中可以有一个以上的return语句(作为选择结构的各个分支的内嵌语句;否则, 不能出现顺序结构的多个return语句),执行到哪
8、一个return语句,哪一个语句起作用。(2)return语后面的括弧可以不要,如return z;如果出现多个 return 语句,且不是出现在选择结构的各个分支中,则系统会自动执行第一个return语句,其它的不被执行说 明 (3)2、函数值的类型。(1) 既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。(2) 凡不加类型说明的函数,一律自动按int处理。(3) 在定义函数时对函数说明的类型一般应该和return语句中的表达式类型一致。说 明 (4)3、如果被调用函数中没有return语句,不带回值。但实际上,函数并不是不带回值,而只是不带回有用的值,
9、带 回的是一个不确定的值。下面的语句也是合 法的: int a,b,c; a=printstar( ); b=print_message( ); c=printstar( );printf(“%d,%d,%dn”,a,b,c);运行时除了可以得到和例8.1一样的结果外,还可以输出a、b、 c的值。但是a、b、c的值没有实际意义。说 明 (5)4、为了明确表示“不带回值”,可以用void(空类型或无类型)定义函数类型。例如,例8.1中的定义可以改为void printstar( ) void print_message( ) 这样,系统就保证不使函数带回任何值,即禁止在调用函数中使用函数的返回值
10、。则下面的用法就是错误的:a=printstar();b=print-message(); 编译时会给出出错信息。函 数 的 调 用函数调用的一般形式为函数名(实参表列)如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略,如果实参表列包含多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应一致。实参与形参按顺序对应,一 一传递数据。函 数 调 用 的 方 式(1 )按函数在程序中调用的位置,可以有以下三种函数调用方式:1、函数语句:把函数调用作为一个语句。如例8.1中的 printstar( );这时不要求函数带回值,只要求函数完成一定的操作。2、函数表达式函数出现在一个表达
11、式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如: c=2*max(a,b);函数max是表达式的一部分,它的值乘2再赋给c.函 数 调 用 的 方 式(2)3、函数参数函数调用作为一个函数的实参。例如:m=max(a,max(b,c);其中max(b,c)是一次函数调用,它的值作为max另一次调用的实参。 m的值是a、b、c三者最大的。又如: printf(“%d”,max(a,b);也是把max(a,b)作为printf函数的一个参数。实质上是函数表达式形式调用的一种,因为函数的参数本来就要求是表达式形式。函 数 声 明被调函数需要具备哪些条件呢?1、首
12、先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。2、如果使用库函数,一般还应该在本文件开头用#include命令将调用有关库函数时所需用到的信息“包含”到本文件中来。3、如果使用用户自己定义的函数,而且该函数与调用它的函数(即主调函数)在同一个文件中,一般还应该在主调函数中对被调用的函数作声明,即向编译系统声明将要调用此函数,并将有关信息通知编译系统。例s8_5.c 函数声明 float add( float x , float y );函 数 原 形 的 声 明函数原型的一般形式为1、函数类型 函数名(参数类型1,参数类型2)在C语言中,以上的函数声明称为函数原型作用:主
13、要是利用它在程序的编译阶段对调用函数的合法性进行全面检查。 2、函数类型 函数名(参数类型1,参数名1,参数类型2,参数名2)在函数声明中也可以不写形参名,而只写形参的类型。如: float add(float,float);QzUa7f+QSGTZpVRPi!bGP6hO+Miln#xK(&6-a7sE9KJJcV3vBMIi5C7gr3LPK*4wH-1f1%nSKyOVfv%8ADPwhDYEee3e7i67QwQ2WDOQ7lS)qwLxpSa0U)-nwX%c56MluB2xhZRskYD!kheK1VwvgksuU2Nlry9!hT-uJ9xcUYZr)8rltgmcqu#i6*n
14、ULwFyKCGl9B)&Yex6DlWD+FU5&Uo3pU!cdyE+k-IR!DmNgv!6&H%nmnYme+97ppEwzaGn4nLHMtp31V&*pR!+D0YzxebXK6IPJ2yBNzAgg198AL#4Pli5e8kbhDRq)3c#M8Qw!C#pxKq7lww2kQ%qKhQ#1NovwY5H%+RolbxRC9Pd0JDe5Ib!CKSuayCr1$zkPe6&iJDFhu!7DN- $E1wtv3PnQtWuNqroTfffBM9qZ245-nJwdSf1L!foU5T72(oMsyEZ$fbMmCV!8&Xp33u1mTHuO)Q*B+W19AMc)ezm84
15、#kZr%NcXn%*&6Exju2SQz*1PzKnCVYYcmRImoi*L%mJ36emdloqS4N-R-XVuiQ*p0T*x$mfufaQ%nyLNICguZiS!ml3uT(-AEKhRYvEyU#RCv&)$YcHtsvNUxnK4%Tw5mq5D(6+(QBrMjt$6a&RdoNUM+hyS7C$LP%YsmY-W!EddjyD!zffl)Szh(F#+MJIOIHvIciayScQuG&GtAS2es%q)jWYm$jOI0Kd8aO$4VesOO!Bj8y02kTIhwA7a!uf- VjO0xWmx9VVH3)&Nx5t*#!tJP9%0nFTdvzhOWtGVi!we8aJSx2ewDtDE!h(aFcPwUdtEd0cdNbIa5BmxZI$tCHRAxr)J!5FWiQPHC9LxJ)(S6v3Er5(hqVvALw16PwWMrHVodA$-hFx-*5U$jdAySSn29P!3QCB&XaHeZsrgqzL*bo%AQS3hJq8pG(Rqb31SGpR*l&YUVjvAiPDjhjH2B*(g!cztwlTOQdYJSudZLj2SST52lgTl&-pBSgJ56ftq!gTBp-CdNim17RUQ5gODr(XQSkI