chapter8new

上传人:z*** 文档编号:243071202 上传时间:2024-09-15 格式:PPT 页数:93 大小:2.55MB
返回 下载 相关 举报
chapter8new_第1页
第1页 / 共93页
chapter8new_第2页
第2页 / 共93页
chapter8new_第3页
第3页 / 共93页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,学习,要点,重点,学习,建议,难点,函数,掌握函数的定义、调用规则,掌握主调函数和被调函数之间数据传递的规则,掌握函数返回值及其类型的概念,掌握局部变量全局变量的定义方法,作用域和生存期,变量的存储类型和特点。掌握函数的嵌套调用和递归调用。,函数之间的数据传递,变量的存储类型,函数的递归调用,上机编程,编写功能函数练习函数的定义、调用和返回。利用跟踪功能,观察函数中变量在函数被调之前和之后的变化,注意全局变量与局部变量、动态变量与静态变量的区别。练习将常用的问题用递归描述,编写递归算法。选做习题集中关于变量存储类型的习题。,第八章 函数,8.1,概述,模块化程序设计,基本思想:将一个大的程序按功能分割成一些小模块,特点:,各模块相对独立、功能单一、结构清晰、接口简单,控制了程序设计的复杂性,提高元件的可靠性,缩短开发周期,避免程序开发的重复劳动,易于维护和功能扩充,开发方法,:,自上向下,逐步分解,分而治之,数学中的函数,自变量,因变量,函数名,说明自变量与因变量的映射关系,程序设计中的函数,程序设计中的函数不局限于计算,计算类,如打印阶乘表的程序,判断推理类,如排序、查找,请问,假如系统提供的函数,printf(),由,10,行代码替换,那么你编过的程序会成什么样子?,实际上一个,printf(),有上千行代码,main(),中能放多少行代码?,如果所有代码都在,main(),中,怎么团队合作?,如果代码都在一个文件中,怎么团队合作?,程序设计的艺术,分而治之,(,Divide and Conquer,Wirth, 1971,),函数把较大的任务分解成若干个较小的任务,并提炼出公用任务,信息隐藏,(,Information Hiding, Parnas, 1972,),设计得当的函数可以把具体操作细节对程序中不需要知道它们的那些部分隐藏掉,从而使整个程序结构清楚,使用函数时,不用知道这个函数内部是如何运作的,只按照我们的需要和它的参数形式调用它即可,复用,程序员可以在其他人定义的函数的基础上构造程序,而不需要从头做起,函数是,C,语言中模块化编程的最小单位,可以把每个函数看作一个模块,如把编程比做制造一台机器,函数就好比其零部件,可将这些“零部件”单独设计、调试、测试好,用时拿出来装配,再总体调试。,这些“零部件”可以是自己设计制造,/,别人设计制造,/,现成的标准产品,函数(,function,)和模块(,module,),C,是模块化程序设计语言,C,程序结构,C,是,函数式,语言,必须有且只能有一个名为,main,的主函数,C,程序的执行总是,从,main,函数开始,在,main,中结束,函数,不能嵌套定义,可以,嵌套,调用,函数的分类,函数生来都是平等的,互相独立的,没有高低贵贱和从属之分,main(),稍微特殊一点点,C,程序的执行,从,main,函数开始,调用其他函数后流程回到,main,函数,在,main,函数中结束整个程序运行,函数分类,从用户角度,标准函数(库函数):由系统提供,用户自定义函数,从函数形式,无参函数,有参函数,使用,库函数,应注意:,1,、函数功能,2,、函数参数的数目和顺序,及各参数意义和类型,3,、函数返回值意义和类型,4,、需要使用的包含文件,Ch7_201.c,8.2,函数的定义,一般格式,合法标识符,函数返回值类型,缺省,int,型,无返回值,void,函数体,函数类型 函数名,(,形参类型说明表,),说明部分,语句部分,例 有参函数(现代风格),int max,(int x,int y,), int z;,z=xy?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”); ,/*,函数功能: 计算平均数,函数入口参数: 整型,x,,存储第一个运算数,整型,y,,存储第二个运算数,函数返回值: 平均数,*,/,函数类型 函数名(形参表),形参类型说明,说明部分,语句部分,传统风格,:,例 有参函数(传统风格),int max(,x,y,),int x,y;, int z;,z=xy?x:y;,return(z);,8.3,函数的返回值,返回语句,形式:,return(,表达式);,或,return,表达式;,或,return;,功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数,说明:,函数中可有多个,return,语句,若无,return,语句,遇,时,自动返回调用函数,若函数类型与,return,语句中表达式值的类型不一致,按前者为准,自动转换-,函数调用转换,void,型函数,例 无返回值函数,void,swap(int x,int y ), int temp;,temp=x;,x=y;,y=temp;,printstar(), printf(*);,main(), int a;,a=printstar();,printf(%d,a);,例 函数带回不确定值,输出:,10,void,printstar(), printf(*);,main(), int a;,a=printstar();,printf(%d,a);,编译错误!,例 函数返回值类型转换,main(), float a,b;,int,c;,scanf(%f,%f,c=max(a,b);,printf(Max is %dn,c);,max,(float x, float y),float,z;,z=xy?x:y;,return(z);,8.4,函数的调用,调用形式,函数名,(,实参表,);,说明:,实参与形参,个数相等,,,类型一致,,,按顺序一一对应,实参表求值顺序,因系统而定(,Turbo 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);,例 参数求值顺序,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,调用方式,函数语句:,例,printstar();,printf(“Hello,World!n”);,函数表达式:,例,m=max(a,b)*2;,函数参数:,例,printf(“%d”,max(a,b);,m=max(a,max(b,c);,函数声明,对被调用函数要求:,必须是,已存在,的函数,库函数,:,#include ,用户自定义函数:,函数类型说明,函数声明,一般形式:,函数类型 函数名,(,形参类型,形参名,. );,或,函数类型 函数名,();,作用:告诉编译系统,函数类型、参数个数及类型,以便检验,函数定义,与,函数声明,不同,函数声明位置:,程序的数据声明部分(函数内或外),下列情况下,可不作函数说明,若函数返值是,char,或,int,型,,系统自动按,int,型处理,被调用函数定义出现在主调函数之前,有些系统,(,如,Borland C+),要求函数声明指出函数返值类型和形参类型,并且对,void,和,int,型函数也要进行函数,声,明,例 函数声明举例,main(), float a,b;,int c;,scanf(%f,%f,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,c=add(a,b);,printf(sum is %f,c);,被调函数出现在主调函数,之前,不必函数声明,/*ch7_5.c*/,main(),float add(float,float);,/*function declaration*/,float a,b,c;,scanf(%f,%f,c=add(a,b);,printf(sum is %f,c);,float add(float x, float y), float z;,z=x+y;,return(z);,float add();,8.5,函数参数及其传递方式,形参与实参,形式参数:,定义函数,时函数名后面括号中的,变量名,实际参数:,调用函数,时函数名后面括号中的,表达式,c=max(a,b);,(,main,函数),(,max,函数),max(int x, int y), int z;,z=xy?x:y;,return(z);,例 比较两个数并输出大者,main(), int a,b,c;,scanf(%d,%d,c=,max(a,b);,printf(Max is %d,c);,max(,int x, int y,), int z;,z=xy?x:y;,return(z);,形参,实参,函数的作用,:把一段计算抽象出来,封装(包装)成独立实体。这种封装程序段称为,函数定义,。,定义后通过函数名就可以用简便方式要求执行该函数所封装的计算。这种描述片段称为,函数调用,。,封装把函数内外隔成两个,世界,。不同世界形成了对函数的两种观点。函数头规定了两个世界的交流方式。,对函数的两种观点,程序员可以在其他函数的基础上构造程序,说明:,实参必须有确定的值,形参必须指定类型,形参与实参,类型一致,个数相同,若形参与实参类型不一致,自动按形参类型转换,函数调用转换,形参在函数被调用前不占内存,;,函数调用时为形参分配内存;调用结束,内存释放,8.5,函数参数及其传递方式,形参与实参,形式参数:定义函数时函数名后面括号中的变量名,实际参数:调用函数时函数名后面括号中的表达式,例 计算,x,的立方,#include ,float cube(,float x,), return(x*x*x);,main(), float a, product;,printf(Please input value of a:);,scanf(%f,product=,cube(a);,printf(”Cube of %.4f is %.4fn,a,product);,x,a,product,1.2,1.2,1.728,参数传递方式,值传递,方式,方式:函数调用时,为形参分配单元,并将实参的值,复制,到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值,特点:,形参与实参占用,不同,的内存单元,单向,传递,-,只由实参传给形参,而不能由形参传给实参,!,7,11,x:,y:,调用前,:,调用结束:,7,11,x:,y:,例 交换两个数,/*ch7_2.c*/,#include ,main(), int x=7,y=11;,printf(x=%d,ty=%dn,x,y);,printf(swapped:n);,swap(x,y);,printf(x=%d,ty=%dn,x,y);,swap(,int a,int b,), int temp;,temp=a; a=b; b=temp;,调用:,7,11,a:,b:,7,11,x:,y:,swap:,7,11,x:,y:,11,7,a:,b,:,temp,地址传递,方式:函数调用时,将数据的,存储地址,作为参数传递给形参,特点:,形参与实参占用,同样,的存储单元,“双向”,传递,实参和形参必须是,地址,常量或变量,/*ch9_3.c*/,swap(p1,p2),int *p1,*p2;, int p;,p=*p1;,*p1=*p2;,*p2=p;,main(), int a,b;,scanf(%d,%d,printf(“a=%d,b=%dn”,a,b);,printf(“swapped:n”);,swap(,printf(”a=%d,b=%dn,a,b);,例 交换两个数,a,5,9,b,调用前:,a,5,9,b,调,swap,:,p1,&a,&b,p2,a,9,5,b,交换,:,p1,&a,&b,p2,a,9,5,b,返回:,#include ,long sum(int a, int b);,long factorial(int n);,main()*,求两个数的阶乘和*, int n1,n2;,long a;,scanf(%d,%d,a=,sum(n1,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;iy?x:y;,return(rz?r:z);,int min(int x,int y,int z), int r;,r=xy?x:y;,return(rz?r:z);,Ch7_202.c,例 用弦截法求方程根,x,y,f(x),0,x,1,x,2,x,f(x,1),f(x,2),求,f(x1),与,f(x2),连线与,x,轴的交点,x,输入,x1,x2,求,f(x1),f(x2),直到,f(x1),与,f(x2),异号,y=f(x),y1=f(x1),y,与,y1,同号,真,假,x1=x,x2=x,直到,|y|,root=x,输出,root,root,函数,运行情况:,Input x1,x2:,2,6,A root of equation is 5.0000,main( ),调用函数,root,输出根,x,结束,root,函数,xpoint,函数,调用函数,xpoint,调用函数,f,f,函数,递归调用,定义:函数直接或间接的调用自身叫函数的递归调用,f( ),调,f,调,f2,调,f1,f1,( ),f2( ),说明,C,编译系统对递归函数的自调用次数没有限制,每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出,int,f(int x), int y,z;,z=f(y);,.,return(2*z);,int,f1(int x), int y,z;,z=f2(y);,.,return(2*z);,int,f2(int t), int a,c;,c=f1(a);,.,return(3+c);,例 求,n,的阶乘,/*ch7_8.c*/,#include ,int fac(int n), int f;,if(n0) printf(n%cn,getone,putone); ,void hanoi(int n,char one,char two,char three), if(n=1) move(one,three);,else,hanoi(n-1,one,three,two);,move(one,three);,hanoi(n-1,two,one,three);,main(), int m;,printf(Input the number of disks:);,scanf(%d,printf(The steps to moving %3d disks:n,m);,hanoi(m,A,B,C);,D:fengyibkcpowerpower.c,A,B,C,8.7,数组作为函数参数,数组元素作函数实参,值传递,例 两个数组大小比较,4,3,2,1,0,5,a,56,23,12,10,76,88,4,3,2,1,0,5,b,21,23,43,98,66,54,n=0,m=0,k=0,i,n=0,m=0,k=1,i,n=0,m=1,k=1,i,n=1,m=1,k=1,i,n=1,m=1,k=2,i,n=2,m=1,k=2,i,n=3,m=1,k=2,a,和,b,为有,10,个元素的整型数组,比较两数组对应元素,变量,n,m,k,记录,aibi, ai=bi,aik,认为数组,ab,若,nk,认为数组,ab,若,n=k,认为数组,a=b,#include ,main(),int a10,b10,i,n=0,m=0,k=0;,printf(Enter array a:n);,for(i=0;i10;i+),scanf(%d,printf(Enter array b:n);,for(i=0;i10;i+),scanf(%d,for(i=0;iy) flag=1;,else if(xy) flag=-1;,else flag=0;,return(flag);,数组名作函数参数,地址传递,在主调函数与被调函数分别定义数组,且类型应一致,形参数组大小,(,多维数组第一维,),可不指定,形参数组名是,地址变量,例 求学生的平均成绩,#include ,float average(int stu10, int n);,void main(),int score10, i;,float av;,printf(Input 10 scores,:,n);,for( i=0; i10; i+ ),scanf(%d, ,av=,average(,score,10);,printf(Average is,:,%.2f, av);,float average(,int,stu10, int n), int i;,float av,total=0;,for( i=0; in; i+ ),total += stui;,av = total/n;,return av;,实参用数组名,形参用数组定义,int stu ,.,.,2,1,0,9,score,56,23,12,.,.,88,stu,例 数组元素与 数组名,作函数参数比较,1,2,a,调用前,a0,a1,1,2,a,调用,a0,a1,1,2,x,y,2,1,x,y,交换,1,2,a,返回,#include ,数组元素,做函数参数,void,swap2(int x,int y), int z;,z=x; x=y; y=z;,main(), int a2=1,2;,swap2(a0,a1);,printf(a0=%dna1=%dn,a0,a1);,值传递,1,2,a,调用前,1,2,a,x,调用,2,1,a,x,交换,2,1,a,返回,#include ,数组名,做函数参数,void,swap2,(int x,), int z;,z=x0; x0=x1; x1=z;,main(), int a2=1,2;,swap2(,a,);,printf(a0=%dna1=%dn,a0,a1);,地址传递,例 数组元素与 数组名,作函数参数比较,例 数组排序,-,简单选择排序,void,sort(,int array,int n), int i,j,k,t;,for(i=0;in-1;i+), k=i;,for(j=i+1;jn;j+),if(arrayjarrayk) k=j;,if(k!=i), t=arrayi;,arrayi=arrayk;,arrayk=t;,main(),int a10,i;,for(i=0;i10;i+),scanf(%d,sort(a,10);,for(i=0;i10;i+),printf(%d ,ai);,printf(n);,0,1,2,3,4,5,6,7,8,9,a,49,68,57,32,9,99,27,13,76,88,array,k,j,j,j,k,j,k,j,j,j,j,j,9,49,i=0,例 数组排序,-,简单选择排序,void,sort(,int array,int n), int i,j,k,t;,for(i=0;in-1;i+), k=i;,for(j=i+1;jn;j+),if(arrayjarrayk) k=j;,if(k!=i), t=arrayi;,arrayi=arrayk;,arrayk=t;,main(),int a10,i;,for(i=0;i10;i+),scanf(%d,sort(a,10);,for(i=0;i10;i+),printf(%d ,ai);,printf(n);,k,j,j,k,j,k,j,j,j,j,j,0,1,2,3,4,5,6,7,8,9,a,49,68,57,32,9,99,27,13,76,88,array,9,49,k,k,13,68,i=1,0,1,2,3,4,5,6,7,8,9,a,9,13,27,32,49,57,68,76,88,99,array,i=8,例 数组排序,-,简单选择排序,void,sort(,int array,int n), int i,j,k,t;,for(i=0;in-1;i+), k=i;,for(j=i+1;jn;j+),if(arrayjarrayk) k=j;,if(k!=i), t=arrayi;,arrayi=arrayk;,arrayk=t;,main(),int a10,i;,for(i=0;i10;i+),scanf(%d,sort(a,10);,for(i=0;i10;i+),printf(%d ,ai);,printf(n);,例 求二维数组中最大元素值,1 3 5 7,2 4 6 8,15 17 34 12,i,j,max=1,1 3 5 7,2 4 6 8,15 17 34 12,i,j,max=3,1 3 5 7,2 4 6 8,15 17 34 12,i,j,max=5,j,1 3 5 7,2 4 6 8,15 17 34 12,i,max=7,j,1 3 5 7,2 4 6 8,15 17 34 12,i,max=7,j,1 3 5 7,2 4 6 8,15 17 34 12,i,max=34,int max_value,(int array34,), int i,j,k,max;,max=array00;,for(i=0;i3;i+),for(j=0;jmax),max=arrayij;,return(max);,main(), int a34=1,3,5,7,2,4,6,8,15,17,34,12;,printf(max value is %dn,max_value(,a,),);,多维形参数组第一维维数,可省略,第二维必须相同,int array4,例 求二维数组中各行元素之和,get_sum_row(,int x3, int result,int row, int col), int i,j;,for(i=0;irow;i+), resulti=0;,for(j=0;jcol;j+),resulti+=xij;,main(), int a23=3,6,9,1,4,7;,int sum_row2,row=2,col=3,i;,get_sum_row(,a,sum_row,row,col);,for(i=0;irow;i+),printf(The sum of row%d=%dn,i+1,sum_rowi);,3,1,4,6,7,9,a,sum_row,x,result,18,12,8.8,变量的存储属性,概述,变量是对程序中数据的存储空间的抽象,内存,.,main(), int a;,a=10,;,printf(“%d”,a);,编译或函数调用时为其分配内存单元,10,2000,2001,程序中使用变量名对内存操作,变量的属性,数据类型:变量所持有的数据的性质(,操作属性,),存储属性,存储器类型:寄存器、静态存储区、动态存储区,生存期,:变量存在时间范围,-,静态变量与动态变量,作用域,:变量在某区域内有效,-,局部变量与全局变量,变量的存储类型,auto -,自动型,register-,寄存器型,static -,静态型,extern -,外部型,变量定义格式,:,存储类型,数据类型 变量表,;,8.8,变量的存储属性,概述,变量是对程序中数据的存储空间的抽象,如,: int sum;,auto,int a,b,c;,register,int i;,static,float x,y;,局部变量与全局变量,局部变量,-,内部变量,定义:在,函数内定义,,,只在本函数内有效,说明:,main,中定义的变量只在,main,中有效,不同函数中同名变量,占不同内存单元,形参属于局部变量,可定义在复合语句中有效的变量,局部变量可用存储类型,:,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,有效,例 不同函数中同名变量,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);,例 复合语句中变量,#define N 5,main(), 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;,for(i=0;iN;i+),printf(%d ,ai);,运行结果:,5 4 3 2 1,例 复合语句中变量,#define N 5,main(), 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;,for(i=0;i,外部变量说明:,extern,数据类型 变量表;,外部变量定义与外部变量声明不同,若外部变量与局部变量同名,则外部变量被屏蔽,外部变量可用存储类型,:,缺省,或,static,float max,min;,float average(float array, int n), int i; float sum=array0;,max=min=array0;,for(i=1;imax),max,=arrayi;,else if(arrayiy?x:y;,return(z);,main(),extern int a,b;,printf(max=%d,max(a,b);,int a=13,b=-8;,运行结果:,max=13,extern int a,b;,int max(), int z;,z=,ab?a:b;,return(z);,main(), printf(max=%d,max();,int a=13,b=-8;,/*ch7_17.c*/,int a=3,b=5;,max(,int a, int b,), int c;,c=ab?a:b;,return(c);,main(),int a=8;,printf(max=%d,max(a,b);,例 外部变量与局部变量,运行结果:,max=8,int i;,main(), void prt();,for(i=0;i5;i+),prt();,void prt(), for(i=0;i5;i+),printf(“%c”,*);,printf(“n”);,例 外部变量副作用,运行结果:,*,动态变量与静态变量,存储方式,静态存储:程序运行期间分配固定存储空间,动态存储:程序运行期间根据需要动态分配存储空间,内存用户区,程序区,静态存储区,动态存储区,全局变量、局部静态变量,形参变量,局部动态变量(,auto register),函数调用现场保护和返回地址等,生存期,静态变量,:,从程序开始执行到程序结束,动态变量,:,从包含该变量定义的函数开始执行至函数执行结束,变量存储类型,静态,动态,存储方式,程序整个运行期间,函数调用开始至结束,生存期,编译时赋初值,,只赋一次,每次函数调用时,赋初值,自动赋初值,0,或空字符,不确定,未赋初值,静态存储区,动态区,存储区,寄存器,局部变量,外部变量,作用域,定义变量的函数或复合语句内,本文件,其它文件,局部变量默认为,auto,型,register,型变量个数受限,且不能为,long, double, float,型,局部,static,变量具有,全局寿命,和,局部可见性,局部,static,变量具有,可继承性,extern,不是变量定义,可扩展外部,变量作用域,register,局部,static,auto,外部,static,外部,存储类别,例 文件,file1.c,int a;,main( ), .,.,f2;,.,f1;,.,f1( ),auto int b;,f2;,.,f2( ),static int c;,C,作用域,b,作用域,a,作用域,main,f2,f1,main,f1,f2,main,a,生存期,:,b,生存期,:,c,生存期:,例,auto,变量的作用域,main(),int x=1,;,void prt(void);,int x=3;,prt();,printf(“2nd x=%dn”,x);,printf(“1st x=%dn”,x);,void prt(void),int x=5;,printf(“3th x=%dn”,x);,运行结果:,3th x=5,2nd x=3,1st x=1,x=1,作用域,x=1,作用域,x=3,作用域,x=5,作用域,main(),void increment(void);,increment();,increment();,increment();,void increment(void),int x=0;,x+;,printf(“%dn”,x);,例 局部静态变量值具有可继承性,运行结果:,1,1,1,main(),void increment(void);,increment();,increment();,increment();,void increment(void),static int x=0;,x+;,printf(“%dn”,x);,运行结果:,1,2,3,例 变量的寿命与可见性,#include ,int i=1;,main(),static int a;,register int b=-10;,int c=0;,printf(-MAIN-n);,printf(i:%d a:%d ,b:%d c:%dn,i,a,b,c);,c=c+8;,other();,printf(-MAIN-n);,printf(i:%d a:%d ,b:%d c:%dn,i,a,b,c);,i=i+10;,other();,other(),static int a=2;,static int b;,int c=10;,a=a+2; i=i+32; c=c+5;,printf(-OTHER-n);,printf(i:%d a:%d ,b:%d c:%dn,i,a,b,c);,b=a;,-Main-,i:1 a:0 b:-10 c:0,-Other-,i:33 a:4 b:0 c:15,-Main-,i:33 a:0 b:-10 c:8,-Other-,i:75 a:6 b:4 c:15,全局,i,1,main: a,0,b:-10,register,main:c,0,静态,存储区,动态,存储区,other: a,2,other: b,0,other: c,10,8,4,33,15,4,43,other: c,10,6,75,15,6,main(), void gx(),gy();,extern int x,y;,printf(“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=0,2: x=135 y=246,3: x=135 y=246,例 引用其它文件中的外部变量,int global;,extern float x;,main(), int local;,.,.,.,extern int global;,static int number;,func2(),.,.,.,float x;,static int number;,func3(), extern int global;,.,.,.,file1.c,file2.c,file3.c,例 引用其它文件中的变量,输出,a,b,和,a,的,m,次方,int a;,main(),int power(int n);,int b=3,c,d,m;,printf(Enter the number a and its power:n);,scanf(%d,%d,c=a*b;,printf(%d*%d=%dn,a,b,c);,d=,power(m);,printf(%d*%d=%d,a,m,d);,extern int a;,int power(int n), int i,y=1;,for(i=1;i=n;i+),y*=a;,return(y);,8.9,内部函数和外部函数,外部函数,根据函数能否被其它源文件调用,将函数区分为内部函数和外部函数。,一 内部函数,如果,一个函数只能被本文件中其它函数所调用,它称为内部函数,。在定义内部函数时,在函数名和函数类型前面加,static,。,static,类型标识符 函数名(形参表),/*e07-08.c*/,static,int fun(), printf(static fun
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


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

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


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