c语言程序设计函数调用.ppt

上传人:tia****nde 文档编号:12805529 上传时间:2020-05-25 格式:PPT 页数:49 大小:239.50KB
返回 下载 相关 举报
c语言程序设计函数调用.ppt_第1页
第1页 / 共49页
c语言程序设计函数调用.ppt_第2页
第2页 / 共49页
c语言程序设计函数调用.ppt_第3页
第3页 / 共49页
点击查看更多>>
资源描述
第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)从用户使用的角度看,函数分两种:标准函数,即库函数。这是由系统提供的,用户不用自己定义。用户自己定义的函数,以解决用户的专门问题。,7.1函数概述,(4)从函数的形式看,函数分两类:无参函数:主调函数并不将数据传送给被调用函数。有参函数:在调用函数时,在主调函数和被调用函数之间有参数传递,也就是说,主调函数可以将数据传给被调用函数使用,被调用函数中的数据也可以带回来供主调函数使用。7.1.2函数的定义1.无参函数的定义类型标识符函数名()说明部分或语句说明:用“类型标识符”指定函数值的类型,即函数带回来的值的类型。C语言默认返回值的类型是整型。2.有参函数的定义,类型标识符函数名(形式参数说明)说明部分语句,类型标识符函数名(形式参数表列)形式参数说明说明部分语句例如:intmax(x,y)intx,y;/*形式参数说明*/intz;/*函数体中的说明部分*/z=xy?x:y;return(z);/*z为函数的返回值*/这是一个求x和y二者中大者的函数,x和y为形式参数,由主调函数的实际参数把参数值传递给被调用函数中的形式参数x和y。,7.2.1函数参数在调用函数时,大多数情况下,主调函数和被调函数之间有数据传递关系。在定义函数时,函数名后面括号中变量名称为“形式参数”,简称“形参”。在调用函数时,函数名后面括号中的表达式称为“实际参数”,简称“实参”。(1)在定义函数中指定的形参变量,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时函数max中的形参才被分配内存单元。调用结束后,形参所占用的内存单元也同时被释放。(2)实参可以是常量、变量或表达式,如:max(3,a+b);但要求它们有确定的值。在调用时将实参的值赋给形参变量。,7.2函数参数和返回值,(3)在定义的函数中,必须指定形参的类型。(4)实参与形参的类型应一致。只有字符型与整型可以互相通用。(5)实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。7.2.2函数的返回值函数的返回值是由return语句传递的。格式:return(表达式);或return表达式;功能:用return语句从函数退出,返回到调用它的程序中.该语句有两重作用:(1)从函数中退出,返回到调用它的程序中。(2)向调用程序返回一个值。,7.3.1函数调用的一般形式格式:函数名(实参表列);函数调用语句的执行过程:首先计算每个实参表达式的值,并把此值存入所对应的形参单元中,然后把执行流程转入函数体中,执行函数体中的语句,函数体执行完之后,将返回到调用此函数的程序中的下一条语句,继续去执行。当执行到函数体的右花括号或return语句时,表示函数体执行完成,这时将返回到主调程序中。,7.3函数的调用,7.3.2对被调用函数的说明在一个函数中调用另一个被调函数,需要具备的条件:(1)首先被调函数必须是已经存在的函数(库函数或用户自定义函数)。(2)如果使用库函数,一般还应在本文件开头用#include命令将调用有关库函数时所需用的信息包含到本文件中来。输入输出库函数:#include使用系统定义的标准输入输出函数。数学库函数:#includemath.h使用系统定义的标准数学运算函数。(3)如果使用用户自己定义的函数,而且该函数与调用它的函数(即主调函数)在同一个文件中,一般还应该在主调函数中对被调用函数的返回值的类型作说明。,这种类型说明的一般形式为:类型标识符被调函数函数名();对被调用函数的说明,在以下几种情况下可以省略:(1)如果函数的值(函数的返回值)是整型或字符型,可以不进行说明,系统对它们自动按整型说明。(2)如果被调用函数的定义出现在主调函数之前,可以不进行说明,因为编译系统已经先知道了已定义的函数类型,会自动处理。(3)如果在所有函数定义之前,对函数类型进行了说明,则在各个主调函数中不再进行说明。7.3.4函数的嵌套调用C语言的函数定义都是互相平行、独立的,可以嵌套调用函数即在调用一个函数的过程中,又调用另一个函数.,7.3.5函数的递归调用在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C语言的特点之一就在于允许函数递归调用。例如:intf(x)intx;inty,z;z=f(y);return(2*z);,7.4.1数组元素做函数实参由于实参可以是表达式,数组元素又可以是表达式的组成部分,因此数组元素可以作为函数的实参,与变量作实参一样,是单向传递,即“值传送”。只能将数组元素的值传递给被调函数的形参,不能带回变化的值。这种方式适合部分数组元素传递和元素较小的数组传递。,7.4数组的作为函数参数,运行结果:形参值为:234实参值为:1237.4.2用数组名做函数的实参与形参例7.1有一个一维数组s,存放10个学生成绩,求平均成绩.floataverage(a)/*数组名a作形参*/floata10;inti;floatv,sum=a0;for(i=1;i10;i+)sum=sum+ai;v=sum/10;return(v);,main()floats10,v;inti;printf(input10s:n);for(i=0;iy?x:y;return(z);main()externinta,b;/*外部变量说明*/printf(max=%dn,max(a,b);inta=10,b=120;/*外部变量定义*/运行结果:max=120,由于外部变量定义在main函数之后,因此在main函数引用外部变量a和b之前,应该用extern进行外部变量说明,说明a、b是外部变量。如果不作extern说明,编译时出错,系统不会认为a、b是已定义的外部变量。一般的做法是外部变量的定义放在引用它的所有函数之前,这样可以避免在函数中多加一个extern说明。外部变量的定义与外部变量的说明并不是一回事。外部变量的定义只能有一次,它的位置在所有函数之外,而同一文件中的外部变量的说明可以有多次,它的位置在函数之内。(4)如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量不起作用。例7.4求两个数的最大值。inta=3,b=5;/*a、b为外部变量*/a、b的作用范围max(a,b),inta,b;/*a、b为局部变量*/intc;c=ab?a:b;return(c);main()inta=10;/*a为局部变量*/printf(max=%dn,max(a,b);运行结果:max=10,形参a、b作用范围,局部变量a作用范围全局变量b作用范围,第一行定义了外部变量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。7.6.1变量的存储类别从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。从变量值存在时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。,7.6动态存储方式与静态存储方式,1.静态存储方式是指在程序运行期间分配固定的存储空间的方式。2.动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式。供用户使用的存储空间可分为三部分:(1)程序区;(2)静态存储区;(3)动态存储区。数据分别存放在静态存储区和动态存储区中。全局变量存放在静态存储区中。在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不是动态地分配和释放。,局部变量存放在动态存储区中,在函数调用开始时分配动态存储空间,函数结束时释放这些空间。在程序执行过程中,这种分配和释放是动态的。在动态存储区中存放以下数据:函数形参变量。在调用函数时,给形参变量分配存储空间.局部变量。未加static说明的局部变量,即自动变量。函数调用时的现场保护和返回地址等。对以上这些数据,在函数调用开始时分配动态存储空间,函数结束时,释放这些空间。程序运行过程中,这种分配和释放是动态的,如果在一个程序中两次调用同一函数,分配给此函数中局部变量的存储空间地址可能是不同的。如果一个程序包含了若干个函数,每个函数中的局部变量的生存期并不等于整个程序的执行周期,它只是程序执行周期的一部分。根据函数调用的需要,动态分配和释放存储空间。,在C语言中每一个变量和函数有两个属性:数据类型和数据的存储类别。存储方法分为两大类:静态存储类和动态存储类。具体包括4种:自动(auto);静态(static);寄存器(register);外部(extern)。7.6.2局部变量的存储方式1.自动存储类别函数中的局部变量,如不为static存储类别都是动态分配存储空间的,存储在动态存储区中,分配和释放存储空间的工作由编译系统自动处理,因此这类局部变量称为自动变量。自动变量用关键字auto作存储类型说明。例如:当局部变量未指明存储类别时,被定义为auto存储类别。intf(a)/*定义函数*/inta;/*定义a为形参*/,autointb,c=9;/*定义b、c为自动变量*/b、c是自动变量,c=9,执行完f函数后自动释放其所占的存储单元。auto也可以省略不写,则隐含确定为“自动存储类别”,它属于动态存储类别。autointb,c=9;与intb,c=9;是等价的。2.静态存储类别存储分类符static既可用于说明全局变量,也可用于说明局部变量。当其作用于局部变量时,该变量称为局部静态变量;其作用于全局变量时,该变量称为外部静态变量。(1)局部静态变量,在函数体内用static说明的变量称为静态局部变量。在程序运行期间,它占据一个永久性的存储单元,在退出函数后,值仍旧保留。静态变量是在编译时赋初值,因此在程序执行期间,一旦存储单元中的值改变,就不会再执行赋初值语句。未赋初值的变量,C编译程序将其置为0。形参不允许说明为静态存储类别。例7.6main()f1();f1();f1();运行结果:x=1,f1()intx=0;x=x+1;printf(x=%dn,x);,x=1x=1若把intx=0;改为:staticintx=0;运行结果如下:x=1x=2x=3从程序可以看出,自动变量在函数每次被调用时,都进行初始化。而静态变量只在编译阶段初始化一次。在上例中,前一种情况x是自动变量,f1()函数每次被调用时,x都初始化,因此,输出结果始终是1。后一种情况x是局部静态变量,f1()函数第一次被调用时,x为0,退出时为1。第二次调用时,x的值是1,仍然存在,因此,输出时x值为2,同样,第三次调用时,x的值为3。(2)外部静态变量,当定义一全局变量时,若将其指定为static类,则说明该全局变量只在本源程序文件中使用,其他的源程序文件不能引用该全局变量。这种外部静态变量主要用于同一程序分别由多人编写完成时的情况,避免不同编程者定义出相同名字的全局变量。对于全局变量,不管是否加static说明,均属于静态存储变量。使用static只是为了限制其引用范围。3.寄存器存储类别为了提高程序的执行效率,C语言允许将局部变量的值放在CPU的通用寄存器中,这种变量称为寄存器变量。寄存器变量用关键字register说明。例如,函数体中的变量说明:registerinta,b;定义了两个寄存器变量a、b,函数运行时将尽可能把a、b的值放在寄存器中。,在计算机中,从内存“存取”数据要比直接从寄存器中“存取”数据慢,所以对一些使用特别频繁的变量,可通过register将其定义成寄存器变量,使程序直接从寄存器中“存取”数据,以提高程序的效率。由于计算机的寄存器数目有限,并且不同的计算机系统允许使用寄存器的个数不同,所以不宜定义太多的寄存器变量,只有将少量变化频繁的变量定义成寄存器变量,如循环控制变量等。当一函数内定义的寄存器变量的个数超过系统所允许使用的寄存器数时,系统将自动将其作为一般局部变量处理,即仍使用内存单元存放其值,并不提高执行速度。说明:(1)只有局部自动变量和形式参数可说明为寄存器变量。(2)一个计算机系统中的寄存器的数目是有限的。(3)不同系统对register的处理不同。,(4)局部静态变量不能定义为寄存器变量,不能写成:registerstatica,b,c;7.6.3全局变量的存储方式全局变量可以使用extern和static存储类别。当未对全局变量指定存储类别时,隐含为extern类别。1.外部存储类别当在一个文件中要引用另一个文件中的全局变量或在全局变量之前要引用它时,可用extern说明。相当于扩大全局变量的作用域。例7.7f1.c程序文件main()intpower();externinta;intb=3,c,d,m;,printf(a,m=?n);scanf(%d,%d,,for(i=1;i1)f=n*fac(n-1)elsef=1;return(f);main()inti;for(i=1;i=5;i+),7.8程序设计举例,printf(%d!=%dn,i,fac(i);运行结果为1!=12!=23!=64!=245!=120,题7.1编写程序,求s=s1+s2+s3+s4的值,其中:s1=1+1/2+1/3+1/50s2=1+1/2+1/3+1/100s3=1+1/2+1.3+1/150s4=1+1/2+1/3+1/200此题目可以首先编一函数,用于求1+1/2+1/3+1/n的值,然后通过函数调用求s的值。题7.2利用选择排序法,对数组a中的10个整数按从小到大的顺序排列,并将排序结果显示出来。选择排序法的基本思想是:先将a0到a9中的最小数与a0对换;再将a1到a9中的最小数与a1对换;依此类推,直到排序完成为止。,7.9程序设计题目,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!