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