c语言程序设计函数调用.ppt
《c语言程序设计函数调用.ppt》由会员分享,可在线阅读,更多相关《c语言程序设计函数调用.ppt(49页珍藏版)》请在三一办公上搜索。
1、第7章函数与变量,7.1函数概述7.2函数参数和返回值7.3函数的调用7.4数组的作为函数参数7.5变量的定义位置和作用域7.6动态存储方式与静态存储方式7.7函数的存储分类7.8程序设计举例7.9程序设计题目,C语言函数分为两种:标准函数和用户自定义的函数。标准函数是系统提供的已设计好的函数,可以直接调用,用户自己定义的函数是用户自己编写的用来解决具体问题的函数.(1)C程序的执行从 main函数开始,调用其他函数后流程回到main函数。(2)所有函数都是平行的,即在定义函数时,是互相独立的,一个函数并不从属于另一函数,即函数不能嵌套定义,但可以互相调用,但不能调用main函数。(3)从用户
2、使用的角度看,函数分两种:标准函数,即库函数。这是由系统提供的,用户不用自己定义。用户自己定义的函数,以解决用户的专门问题。,7.1函数概述,(4)从函数的形式看,函数分两类:无参函数:主调函数并不将数据传送给被调用函数。有参函数:在调用函数时,在主调函数和被调用函数之间有参数传递,也就是说,主调函数可以将数据传给被调用函数使用,被调用函数中的数据也可以带回来供主调函数使用。7.1.2 函数的定义 1.无参函数的定义 类型标识符 函数名()说明部分 或 语句 说明:用“类型标识符”指定函数值的类型,即函数带回来的值的类型。C语言默认返回值的类型是整型。2.有参函数的定义,类型标识符 函数名(形
3、式参数说明)说明部分 语句,类型标识符 函数名(形式参数表列)形式参数说明 说明部分 语句例如:int max(x,y)int x,y;/*形式参数说明*/int z;/*函数体中的说明部分*/z=xy?x:y;return(z);/*z为函数的返回值*/这是一个求x和y二者中大者的函数,x 和 y为形式参数,由主调函数的实际参数把参数值传递给被调用函数中的形式参数x和y。,7.2.1 函数参数 在调用函数时,大多数情况下,主调函数和被调函数之间有数据传递关系。在定义函数时,函数名后面括号中变量名称为“形式参数”,简称“形参”。在调用函数时,函数名后面括号中的表达式称为“实际参数”,简称“实参
4、”。(1)在定义函数中指定的形参变量,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时函数 max 中的形参才被分配内存单元。调用结束后,形参所占用的内存单元也同时被释放。(2)实参可以是常量、变量或表达式,如:max(3,a+b);但要求它们有确定的值。在调用时将实参的值赋给形参变量。,7.2函数参数和返回值,(3)在定义的函数中,必须指定形参的类型。(4)实参与形参的类型应一致。只有字符型与整型可以互相通用。(5)实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。7.2.2 函数的
5、返回值 函数的返回值是由return语句传递的。格式:return(表达式);或 return表达式;功能:用return语句从函数退出,返回到调用它的程序中.该语句有两重作用:(1)从函数中退出,返回到调用它的程序中。(2)向调用程序返回一个值。,7.3.1 函数调用的一般形式 格式:函数名(实参表列);函数调用语句的执行过程:首先计算每个实参表达式的值,并把此值存入所对应的形参单元中,然后把执行流程转入函数体中,执行函数体中的语句,函数体执行完之后,将返回到调用此函数的程序中的下一条语句,继续去执行。当执行到函数体的右花括号或return语句时,表示函数体执行完成,这时将返回到主调程序中。
6、,7.3函数的调用,7.3.2 对被调用函数的说明 在一个函数中调用另一个被调函数,需要具备的条件:(1)首先被调函数必须是已经存在的函数(库函数或用户自定义函数)。(2)如果使用库函数,一般还应在本文件开头用#include命令将调用有关库函数时所需用的信息包含到本文件中来。输入输出库函数:#include 使用系统定义的标准输入输出函数。数学库函数:#include math.h使用系统定义的标准数学运算函数。(3)如果使用用户自己定义的函数,而且该函数与调用它的函数(即主调函数)在同一个文件中,一般还应该在主调函数中对被调用函数的返回值的类型作说明。,这种类型说明的一般形式为:类型标识符
7、 被调函数函数名();对被调用函数的说明,在以下几种情况下可以省略:(1)如果函数的值(函数的返回值)是整型或字符型,可以不进行说明,系统对它们自动按整型说明。(2)如果被调用函数的定义出现在主调函数之前,可以不进行说明,因为编译系统已经先知道了已定义的函数类型,会自动处理。(3)如果在所有函数定义之前,对函数类型进行了说明,则在各个主调函数中不再进行说明。7.3.4 函数的嵌套调用C 语言的函数定义都是互相平行、独立的,可以嵌套调用函数即在调用一个函数的过程中,又调用另一个函数.,7.3.5 函数的递归调用 在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C 语言
8、的特点之一就在于允许函数递归调用。例如:int f(x)int x;int y,z;z=f(y);return(2*z);,7.4.1 数组元素做函数实参 由于实参可以是表达式,数组元素又可以是表达式的组成部分,因此数组元素可以作为函数的实参,与变量作实参一样,是单向传递,即“值传送”。只能将数组元素的值传递给被调函数的形参,不能带回变化的值。这种方式适合部分数组元素传递和元素较小的数组传递。,7.4数组的作为函数参数,运行结果:形参值为:2 3 4 实参值为:1 2 37.4.2 用数组名做函数的实参与形参 例7.1 有一个一维数组s,存放10个学生成绩,求平均成绩.float averag
9、e(a)/*数组名a作形参*/float a10;int i;float v,sum=a0;for(i=1;i10;i+)sum=sum+ai;v=sum/10;return(v);,main()float s10,v;int i;printf(input10s:n);for(i=0;i10;i+)scanf(%f,运行结果:input10s:100 56 78 98.5 76 87 99 67.5 75 97 average is 83.40,说明:(1)用数组名做函数参数,应该在主调函数和被调函数中分别定义数组。(2)实参数组与形参数组类型应一致。(3)实参数组和形参数组大小可以一致也可以
10、不一致,C 编译时对形参数组大小不作检查,只是将实参数组的首地址传给形参数组。若要求形参数组得到实参数组全部的元素值,则应当指定形参数组与实参数组大小一致。也可以不指定形参数组大小,在定义数组名后面跟一个空的方括弧,为了在被调函数中处理数组元素的需要,可以另设参数,说明传递数组元素的个数。例7.2 float average(a,n)/*a为形参数组名,n用于说明数组元素个数*/float a;,int n;int i;float v,sum=a0;for(i=1;in;i+)sum=sum+ai;v=sum.n;return(v);main()float score15=98.5,97,91
11、.5,60,55;float score28=67,88.5,79,45,90,81,77.5,99;,printf(the average of class1is%6.2fn,average(score1,5);/*调用时5为形参数组a的元素个数*/printf(the average of class2is%6.2fn,average(score2,8);运行结果:the average of class1is 80.40 the average of class2is 78.37 这么处理数组的大小就可以不同。(4)数组名做函数参数时,把实参数组的起始地址传递给形参数组,这样两个数组就共
12、占同一段内存单元。如图7.1所示.假如 a数组的起始地址为 1000,则s数组的起始地址也为1000,显然,a和s同占一段内存单元。a 0与s 0同占一个单元。,这种传递方式叫“地址传递”。由此可以看到,形参数组中各元素的值发生变化,会使实参数组元素的值同时发生变化。这一点与变量函数参数的情况不同。a0a1a2a3a4a5a6a7a8a9 2 4 6 8 10 12 14 16 18 20 s0s1s2s3s4s5s6s7s8s9 C 语言中变量的定义有三个基本位置:函数内部、函数参数中及所有函数外部。这些变量分别称为局部变量、形式参数变量、全局变量。定义位置不同,变量的作用域不同,即变量所起
13、作用的范围不同。有关形式参数已经介绍过。,图7.1 用数组名做参数时,形参与实参的存储关系,7.5变量的定义位置和作用域,7.5.1 局部变量 局部变量又称做内部变量,是在函数内部定义的变量。形参也是局部变量。其作用域是从定义的位置起,到函数体结束止。也就是说,只能在定义该变量的函数内使用它,在此函数以外不能使用。对于局部变量,它只在进入本函数时生成,在退出该函数时消失。因此在C语言中不同的函数内可以定义相同名字的变量,它们代表的对象不同,互不影响。例如:f1()int a,b;a=5;b=10;,局部变量a,b的作用域,f2()int a,b;a=100;b=-200;f1()和f2()中的
14、变量a、b均为局部变量,并且互不相关。其原因是每个a、b作为局部变量仅在被定义的函数内是可知的。在复合语句中也可以定义本段程序的局部变量。例如:,局部变量a,b的作用域,f(x)int x;int a;if(x0)int b=40;b 的作用域仅在其定义的分程序之内,即进入分程序时建立b变量,结束分程序时立即撤消。,b的作用域,x、a的作用域,7.5.2 全局变量 全局变量又称做外部变量,是在函数外部定义的变量。其有效范围是从变量定义的位置开始到本源文件结束止。若在同一个源文件中,局部变量与全局变量同名,则在局部变量的作用范围内,全局变量被屏蔽,不起作用。在函数体外进行的函数说明也使该函数具有
15、全局的性质。,int a=1,b=5;float f1(x)int x;int c,d;char c1,c2;char f2(x,y)int x,y;int i,j;main()int m,n;,全局变量c1、c2作用域,全局变量a、b作用域,a、b、c1、c2都是全局变量,但它们的作用范围不同。在main函数和函数f2中可以使用全局变量a、b、c1、c2,但在函数f1中,只能使用全局变量a、b,而不能使用c1和c2。说明:(1)全局变量的作用:增加函数间数据联系的渠道。由于同一文件中的所有函数都能引用全局变量的值,因此,如果在一个函数中改变了全局变量的值,就能影响到其他函数,相当于各个函数间
16、有直接的传递通道。由于函数的调用只能带回一个返回值,因此有时可以利用全局变量增加与函数联系的渠道,从函数得到一个以上的返回值。对于全局变量,如果在定义时不进行初始化,则系统将自动赋予其初值,对数值型赋0,对于字符型赋空0。,(2)使用全局变量会增加程序的内存开销,因为全局变量在程序的整个执行过程中都有效,即一直占用着内存单元,而不是像局部变量那样,在进入其所在函数时才开辟存储单元,退出函数时便将其释放。使用全局变量,还会降低函数通用性,而且会降低程序的清晰度。建议不要无限制地使用全局变量。(3)在定义全局变量时,最理想的定义位置是在源文件的开头处,这样,在整个文件中的所有函数均可使用该变量。如
17、果将一全局变量定义在源程序文件的中间,则其前面的函数不能使用该变量。如果在定义点之前的函数想引用该外部变量,则应该在该函数中用关键字extern作“外部变量说明”。表示该变量在函数的外部定义,在函数内部可以使用它们。见例7.10.例7.3 求两个数的最大值。int max(x,y)int x,y;,int z;z=xy?x:y;return(z);main()extern int a,b;/*外部变量说明*/printf(max=%dn,max(a,b);int a=10,b=120;/*外部变量定义*/运行结果:max=120,由于外部变量定义在main函数之后,因此在main函数引用外部变
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 函数 调用
链接地址:https://www.31ppt.com/p-5426417.html