c语言 子函数

上传人:小** 文档编号:56409476 上传时间:2018-10-12 格式:PPT 页数:33 大小:280.50KB
返回 下载 相关 举报
c语言 子函数_第1页
第1页 / 共33页
c语言 子函数_第2页
第2页 / 共33页
c语言 子函数_第3页
第3页 / 共33页
c语言 子函数_第4页
第4页 / 共33页
c语言 子函数_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《c语言 子函数》由会员分享,可在线阅读,更多相关《c语言 子函数(33页珍藏版)》请在金锄头文库上搜索。

1、第七章 函 数,7.1 概 述,函数调用示例:,一个源文件由一个或多个函数组成,是一个独立编译单元。 一个C程序由一个或多个源文件组成; C程序执行总是从main函数开始,调用其他函数后流程回到main。 函数不能嵌套定义,但可互相调用。注意不能调用main函数。,四、函数的分类,有参函数例(输出两数中大者) #include main( ) int max(int x,int y);int n1,n2,a;scanf(“%d,%d“,无参函数例 main() print_star(); print_message(); print_star() ;print_star() prinf(“*

2、n”); print_message() prinf(“ Hello! n ”); ,7.2 函数的定义与应用,例如: print_message() printf(“Hello! n ”);,例如:求x和y二者中大者 int max (int x, int y) /*x,y为形参*/ int z; /*函数体中变量的说明*/z=xy?x:y;return (z) ; /*将z的值作为函数返回值*/,若无参数,类型标识符写void或不写,三、 形式参数和实际参数, 实参可是常量、变量或表达式,必须有确定的值;多个实参间用逗号隔开;, 对每个形参必须指明其名字和数据类型;, 实参个数、类型必须与

3、对应的 形参一致;, 形参是函数的内部变量,只在函数内部才有意义;,实参对形参的数据传递是值传递,即单向传递,只由实参传递给形参,反之不可。调用结束后,只有形参单元被释放,实参单元中的值不变。, 形参调用前不占内存单元, 调用时占用, 调用后释放;,关于参数的几点说明,有确定值的常量、变量或表达式,五、函数调用的一般形式,在程序编译阶段对调用函数的合法性进行全面检查。如没有函数声明,编译到包含函数调用的语句时(如xx(a,b)),编译系统不知道xx是函数名,也无法判断实参(a,b)的类型和个数是否正确,无法进行正确性的检查。只有在运行时才会发现实参与形参的类型或个数不一致,出现运行错误。,在C

4、语言中,以上的函数说明称为函数原型。,/*定义add函数*/ float add (float x,float y) float z;z=x+y; return (z); ,main() float add(float x,float y); float a, b, c;scanf(“ %f, %f”, ,对被调用函数的说明,作为表达式被调用,例1:编写函数,求n!。,long xx(int x) long t=1;int i;if(x=0) printf(“error”);elsefor(i=1;i=x,i+)t=t*i;return (t);main() int n;long s;scan

5、f(“%d”,例2:编写函数,求1+2+3+.n。,int mm(int x) int t=0;int i;for(i=1;i=x,i+)t=t+i;return (t);main() int n;int s;scanf(“%d”,7.3 函数的嵌套调用,例题:编写函数,求1!+3!+5!+.k! 其中k是小于9的奇数,要求该函数中调用求阶乘函数求出各阶乘的值。,double xx(int x) double t=1; int i;for(i=1;i=x,i+)t=t*i;return (t) ; double yy(int m) double s=0; int i;for(i=1;i=m;i

6、+)if (i%2!=0) s=s+xx(i);return(s); main() int n;double sum;scanf(“%d”,7.4 函数的递归调用,例:用递归法求n!,main() double jx(int m)int n; double t;printf(“Input n :”);scanf(“%d”, ,double jx(int m) double f;if(m=1) f=1;else f=jx(m-1)*m;return f; ,7.5 变量的作用域,主函数 main 定义的变量只在主函数中有效,主函数不能使用其它函数定义的变量。 不同函数中的同名变量互不影响。 形参

7、也是局部变量。,从定义变量的位置开始到本文件结束,这段程序中的函数可直接使用外部变量。 如果在定义点之前的函数想使用外部 变量,则应该在该函数中用关键字 extern 作“外部变量”说明。 如果在同一源文件中,外部变量和局部变量同名,则在局部变量的作用范围内,外部变量不起作用。,7.6 变量的存储类别,一、静态存储方式和动态存储方式,静态存储方式:程序运行期间分配固定存储空间的方式。,动态存储方式:程序运行期间根据需要进行动态的分配存储空间的方式。,程序区,静态存储区,动态存储区,全局变量,局部静态变量,形式参数 局部变量(自动) 函数调用的现场 保护和返回地址,二、静态存储变量和动态存储变量

8、,静态存储变量:用静态存储方式存储的变量。,动态存储变量:用动态存储方式存储的变量。,特点:在 静态存储区分配存储单元,整个程序运行期间都不释放。,特点:函数开始调用时为变量分配存储空间,函数结束时释放这些空间。一个程序两次调用同一函数,其中同一个局部变量的内存地址可能不同。,存储类型:数据在内存中的存储方式。即静态存储方式和动态存储方式。,三、变量的属性及其定义,数据类型:整型,实型,字符型,存储分类符:,auto (自动的)、register(寄存器的) static (静态的)、 extern(外部的),定义变量的一般形式:,存储分类符 类型标识符 变量名;,如:auto int a;s

9、tatic int b;register int d;,1. auto(自动的),例如:auto int a;,四、变量的存储类型,auto说明局部变量,该局部变量是自动变量;,自动变量存放在动态存储区,属于动态存储变量;,变量作用域是其所在的函数内部。,说明:,在一个函数内如果局部变量不作存储类型说明,均为自动变量;,形式参数缺省存储类型是auto,但不能将auto加在形参说明之前。,如:int b, c=3 等价于 auto int b, c=3;,如:int max(auto int x, auto int y) ,2. static(静态的),static可用于说明,局部变量局部静态变

10、量,全局变量外部静态变量,局部静态变量,作用域仅限于定义它的函数内部 。,存放在静态存储区,整个程序运行期间都不释放。,编译时赋初值,每次调用不再赋初值,只保留调用结束时变量的值。自动变量调用一次,重新赋值一次。,局部静态变量不赋初值,编译时自动赋0。自动变量不赋初值,其值不确定。,例如:打印1!5! int fac(int n) static int f=1; f=f*n; return(f) ,main() int i;for(i=1;i=5;i+)printf(“%d!=%dn”,i,fac(i);,外部静态变量,只能在本源程序文件中被使用。,不论是否加static说明,编译时分配在静态

11、存储区。,3. register(寄存器的),寄存器:CPU中运算器的组成部分,暂时存放数据。,寄存器变量:直接放置在运算器的寄存器中的变量。引入寄 存器变量是为了提高“存取”速度。,属于动态存储变量,但不放在动态存储区中,放在寄存器中。,说明:,寄存器变量的作用域与自动变量相同。,regiser只适用于说明局部变量;,例如:register int i; 定义了i是寄存器变量。,计算机的寄存器数目有限,不宜定义太多寄存器变量。不同的系统允许使用的寄存器个数是不同的。,只有局部变量(非静态的)和形参可以作为寄存器变量。,例如:register static int i; ,4. exturn(

12、外部的),exturn适用于说明全局变量;,在多个源程序文件组成的程序中,/*文件A.c*/int a;main(),例如:,/*文件B.c*/exturn int a;power(),也可以写成exturn a;,如果B文件中引用在A文件中定义的全局变量 (该全局变量不是static变量),需要在B文件 中,用关键字extern说明。,在同一个源文件中,全局变量的作用域之外的函数中使用该全局变量时,也需用extern对其说明。,若在A文件中的全局变量是静态外部变量(static),则即使在B文件中用extern对其说明,也无法在A文件中使用该全局变量。,/*文件A.c*/static int a;main(),例如:,/*文件B.c*/exturn int a;power(),无法使用变量a,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号