函数及变量的存储类别精选PPT.ppt





《函数及变量的存储类别精选PPT.ppt》由会员分享,可在线阅读,更多相关《函数及变量的存储类别精选PPT.ppt(81页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、函数及变量的存储类别第1页,此课件共81页哦第5章 函数及变量的存储类别5.0 概述模块化程序设计v基本思想:将一个大的程序按功能分割成一些小模块,v特点:l各模块相对独立、功能单一、结构清晰、接口简单l控制了程序设计的复杂性l提高元件的可靠性l缩短开发周期l避免程序开发的重复劳动l易于维护和功能扩充v开发方法:自上向下,逐步分解,分而治之第2页,此课件共81页哦C是模块化程序设计语言C程序结构&C是函数式语言&必须有且只能有一个名为main的主函数&C程序的执行总是从main函数开始,在main中结束&函数不能嵌套定义,可以嵌套调用第3页,此课件共81页哦函数分类v从用户角度l标准函数(库函
2、数):由系统提供l用户自定义函数v从函数形式l无参函数l有参函数使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件第4页,此课件共81页哦#includestdio.hmain()int n,k,c;printf(nplease input(n,k):);/*输入n、k的值*/scanf(%d,%d,&n,&k);c=fac(n)/(fac(k)*fac(n-k);/*三次调用函数fac,求n!、k!、(n-k)!*/printf(nC(n,k)=%d,c);/*输出计算结果*/int fac(int m)/*计算一个整数的
3、阶乘*/int i,s=1;for(i=1;iy?x:y;return(z);例 有参函数(现代风格)int max(int x,y)int z;z=xy?x:y;return(z);例 空函数 dummy()函数体为空例 无参函数 printstar()printf(“*n”);或 printstar(void)printf(“*n”);第6页,此课件共81页哦函数类型 函数名(形参表)形参类型说明说明部分语句部分传统风格:例 有参函数(传统风格)int max(x,y)int x,y;int z;z=xy?x:y;return(z);第7页,此课件共81页哦int max(int x1,i
4、nt x2,int x3)/*定义函数的返回值类型,函数名,形参*/int max;if(x1x2)max=x1;else max=x2;if(maxy?x:y;return(z);第11页,此课件共81页哦5.2 函数的调用5.2.1 调用形式:函数名(实参表)函数语句:函数调用可单独成为一个语句 例 output();;printf(“Hello,World!n”);v函数表达式:调用函数后的返回值可参加表达式的计算,这时要求被调函数带返回值。例 sum=add(a,b);c=fac(n)/(fac(k)*fac(n-k);v函数参数:带返回值的函数调用亦可作为其它函数的参数(实际参数)例
5、 printf(“%d”,max(a,b);m=max(a,max(b,c);第12页,此课件共81页哦调用方式v函数语句:函数调用可单独成为一个语句 例 output();;printf(“Hello,World!n”);v函数表达式:调用函数后的返回值可参加表达式的计算,这时要求被调函数带返回值。例 sum=add(a,b);c=fac(n)/(fac(k)*fac(n-k);v函数参数:带返回值的函数调用亦可作为其它函数的参数(实际参数)例 printf(“%d”,max(a,b);m=max(a,max(b,c);第13页,此课件共81页哦调用函数的过程是:为函数的所有形参分配内存单元
6、。计算各个实参表达式的值,一一对应的赋值给相应形参(若是无参函数,上述过程不执行)。进入函数体,执行函数中的语句,实现函数的功能。执行到return语句时,计算return语句中表达式的值(若是无返回值函数,本项不做),返回到主调函数。释放形参及本函数内的局部变量所占内存,继续执行主调函数中的后继语句。说明:l实参与形参个数相等,类型一致,按顺序一一对应l形参与实参的结合顺序,因系统而定(Turbo C 自右向左)第14页,此课件共81页哦main()int i=2,p;p=f(i,+i);printf(%d,p);int f(int a,int b)int c;if(ab)c=1;else
7、if(a=b)c=0;else c=-1;return(c);例 参数求值顺序main()int i=2,p;p=f(i,i+);printf(%d,p);int f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);运行结果:0运行结果:1第15页,此课件共81页哦对于函数的位置:对于非int函数,调用单位的位置要在被调用单位在下面,否则编译产生错误。解决方法是:在调用单位加上被调用函数的声(说)明。void f()main()f();void f()main()f();void f()main()void f()
8、;f();第16页,此课件共81页哦5.2.2 函数说明v对被调用函数要求:l必须是已存在的函数l库函数:#include l用户自定义函数:函数类型说明v函数说明l一般形式:函数类型 函数名(形参类型 形参名,.);或 函数类型 函数名();l作用:告诉编译系统函数类型、参数个数及类型,以便检验;l函数定义与函数说明不同;l函数说明位置:程序的数据说明部分(函数内或外);l下列情况下,可不作函数说明u若函数返值是char或int型,系统自动按int型处理;u被调用函数定义出现在主调函数之前;l有些系统(如Borland C+)要求函数说明指出函数返值类型和形参类型,并且对void 和 int
9、 型函数也要进行函数说明第17页,此课件共81页哦例 函数说明举例main()float a,b;int c;scanf(%f,%f,&a,&b);c=max(a,b);printf(Max is%dn,c);max(float x,float y)float z;z=xy?x:y;return(z);int型函数可不作函数说明(Borland C+不行)/*ch7_5.c*/float add(float x,float y)float z;z=x+y;return(z);main()float a,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sum i
10、s%f,c);被调函数出现在主调函数之前,不必函数说明/*/main()float add(float,float);/*function declaration*/float a,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sum is%f,c);float add(float x,float y)float z;z=x+y;return(z);float add();第18页,此课件共81页哦 例4.4 4.5第19页,此课件共81页哦C语言中,函数调用是值传递方式,即函数的实际参数和形式参数之间的数据传递方向是单向的,只能由实际参数传递给形式参数,而
11、不能由形式参数传递给实际参数,是实际参数向形式参数单向赋值的关系。在内存中,形式参数与实际参数占用不同的内存单元。当调用函数时,给形式参数分配内存单元,将实际参数的值赋值给形式参数,调用后,形式参数单元释放,实际参数仍保留调用前的值,形式参数值的变化不影响实际参数。5.2.3 函数参数及其传递方式形参与实参v形式参数:定义函数时函数名后面括号中的变量名v实际参数:调用函数时函数名后面括号中的表达式第20页,此课件共81页哦c=max(a,b);(main 函数)(max 函数)max(int x,int y)int z;z=xy?x:y;return(z);例 比较两个数并输出大者main()
12、int a,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Max is%d,c);max(int x,int y)int z;z=xy?x:y;return(z);形参实参第21页,此课件共81页哦v说明:l实参必须有确定的值l形参必须指定类型l形参与实参类型一致,个数相同l若形参与实参类型不一致,自动按形参类型转换函数调用转换l形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放第22页,此课件共81页哦例 计算x的立方#include float cube(float x)return(x*x*x);main()float a,pro
13、duct;printf(Please input value of a:);scanf(%f,&a);product=cube(a);printf(”Cube of%.4f is%.4fn,a,product);xaproduct1.21.21.728第23页,此课件共81页哦参数传递方式v值传递方式l方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值l特点:u形参与实参占用不同的内存单元u单向传递第24页,此课件共81页哦35a:b:调用前:调用结束:35a:b:例 5.6 交换两个数#include main()int a=3,b
14、=5;printf(“a=%d,tb=%dn,a,b);printf(swapped:n);swap(a,b);printf(“a=%d,tb=%dn,a,b);swap(int x,int y)int temp;temp=x;x=y;y=temp;调用35x:y:35a:b:swap:temp35a:b:x:35y:第25页,此课件共81页哦v如何实现“地址传递”?l只能是:函数调用时,将数据的存储地址作为参数传递给形参,当然此时的行参只能是能存储地址的变量(指针变量)。才能达到“双向”传送的目的。第26页,此课件共81页哦swap(p1,p2)int*p1,*p2;int p;p=*p1;
15、*p1=*p2;*p2=p;main()int a,b;scanf(%d,%d,&a,&b);printf(“a=%d,b=%dn”,a,b);printf(“swapped:n”);swap(&a,&b);printf(”a=%d,b=%dn,a,b);例 交换两个数a59b调前:a59b调swap:p1&a&bp2a95b交换:p1&a&bp2a95b返回:第27页,此课件共81页哦#include long sum(int a,int b);long factorial(int n);main()int n1,n2;long a;scanf(%d,%d,&n1,&n2);a=sum(n1
16、,n2);printf(a=%1d,a);long sum(int a,int b)long c1,c2;c1=factorial(a);c2=factorial(b);return(c1+c2);long factorial(int n)long rtn=1;int i;for(i=1;i=n;i+)rtn*=i;return(rtn);long sum(int a,int b);long factorial(int n);文件包含编译预处理命令函数类型说明函数定义函数调用函数调用函数返回值形参实参第28页,此课件共81页哦5.3 变量的作用域和存储类别变量是对程序中数据的存储空间的抽象内存
17、.main()int a;a=10;printf(“%d”,a);编译或函数调用时为其分配内存单元1020002001程序中使用变量名对内存操作第29页,此课件共81页哦v变量的属性l数据类型:变量所持有的数据的性质(操作属性)l存储属性u存储器类型:寄存器、静态存储区、动态存储区u生存期:变量在某一时刻存在-静态变量与动态变量u作用域:变量在某区域内有效-局部变量与全局变量v变量的存储类型lauto -自动型lregister-寄存器型lstatic -静态型lextern -外部型v变量定义格式:存储类型 数据类型 变量表;如:int sum;auto int a,b,c;register
18、 int i;static float x,y;第30页,此课件共81页哦v变量的作用域l程序中所声明的在程序的那一部分中是可用的。l只有在自己的作用域中才可用。第31页,此课件共81页哦从作用域角度考虑分为:内部变量、外部变量v内内部部变变量量(局局部部变变量量)的的作作用用域域:是定义它的函数内或复合语句内,在它的作用域之外,内部变量是不可见的,也就是说,一个函数内定义的内部变量是不能被其它的函数所引用的。v特性:有助实现信息隐蔽,即使不同的函数定义了同名的内部变量,也不会相互影响。第32页,此课件共81页哦v内部变量-局部变量l定义:在函数内定义,只在本函数内有效l说明:umain中定义
19、的变量只在main中有效u不同函数中同名变量,占不同内存单元u形参属于局部变量u可定义在复合语句中有效的变量u局部变量可用存储类型:auto register static (默认为auto)float f1(int a)int b,c;.char f2(int x,int y)int i,j;main()int m,n;.a,b,c有效x,y,i,j有效m,n有效第33页,此课件共81页哦复合语句中变量#define N 5main()int i;int aN=1,2,3,4,5;for(i=0;iN/2;i+)int temp;temp=ai;ai=aN-i-1;aN-i-1=temp;f
20、or(i=0;iN;i+)printf(%d ,ai);运行结果:5 4 3 2 1例 不同函数中同名变量main()int a,b;a=3;b=4;printf(main:a=%d,b=%dn,a,b);sub();printf(main:a=%d,b=%dn,a,b);sub()int a,b;a=6;b=7;printf(sub:a=%d,b=%dn,a,b);运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4第34页,此课件共81页哦外部变量(全局变量)(全局变量)定义定义:在函数外面定义的变量。外部变量的作用域:外部变量的作用域:对于只有一个源程序文件构
21、成的程序,外部变量的作用域是从定义它的位置开始,直至它所在源程序文件的结束。特点:特点:外部变量的使用增加了函数之间传递数据的途径,在外部变量的作用域内的任何函数都能引用该外部变量,一个函数对外部变量的修改,能影响到其它引用这个变量的函数;因此对外部变量的使用不当,会产生意外的错误。第35页,此课件共81页哦float max,min;float average(int n)int i;float x;scanf(“%f”,&x);max=min=x;for(i=2;imax)max=x;else if(xb?a:b;return(c);main()int a=8;printf(“a=%dn,
22、b=%dn,max=%dn,a,b,max(a,b);外部变量与局部变量同名时,在内部变量的作用域中,外部变量被屏蔽。例:运行结果:a=8 /*main中的a*/b=5 /*main中的b*/max=8第37页,此课件共81页哦int i;main()void prt();for(i=0;i5;i+)prt();void prt()for(i=0;iy?x:y;return(z);main()extern int a,b;printf(max=%d,max(a,b);int a=13,b=-8;运行结果:max=13extern int a,b;int max()int z;z=ab?a:b;
23、return(z);main()printf(max=%d,max();int a=13,b=-8;第39页,此课件共81页哦int p=1,q=5;float f1(int a)int b,c;.int f3().char c1,c2;char f2(int x,int y)int i,j;main()int m,n;.c1,c2的作用范围p,q的作用范围extern char c1,c2;c1,c2的作用范围扩展后 c1,c2的作用范围扩展后extern char c1,c2;第40页,此课件共81页哦main()void gx(),gy();extern int x,y;printf(“
24、1:x=%dty=%dn”,x,y);y=246;gx();gy();void gx()extern int x,y;x=135;printf(“2:x=%dty=%dn”,x,y);int x,y;void gy()printf(“3:x=%dty=%dn”,x,y);用extern扩展外部变量作用域例子:运行结果:1:x=0 y=02:x=135 y=2463:x=135 y=246第41页,此课件共81页哦int global;/*定义*/extern float x;/*说明*/main()int local;.extern int global;/*说明*/int number;/*
25、定义*/func2().float x;/*定义*/int number;/*定义*/func3()extern int global;/*说明*/.file1.cfile2.cfile3.c外部变量(全局变量)继续:对于多文件程序,在一个源文件中定义的外部变量还可以在其它的文件中使用,这时需要在使用它的文件中用extern进行说明,这样的变量称为程序级的变量。第42页,此课件共81页哦 应尽量少使用全局变量,因为:Y全局变量在程序全部执行过程中占用存储单元Y降低了函数的通用性、可靠性,可移植性Y降低程序清晰性,容易出错 定义 说明u次数:只能1次 可说明多次u位置:所有函数之外 函数内或函数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 变量 存储 类别 精选 PPT

限制150内