收藏 分销(赏)

第6章-函数和模块设计.ppt

上传人:w****g 文档编号:12805517 上传时间:2025-12-08 格式:PPT 页数:98 大小:1,005KB 下载积分:8 金币
下载 相关 举报
第6章-函数和模块设计.ppt_第1页
第1页 / 共98页
第6章-函数和模块设计.ppt_第2页
第2页 / 共98页


点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二层,第三层,第四层,第五层,*,程序设计基础(C语言)wh,*,第 6 章,函 数 和 模 块 设 计,12/8/2025,1,程序设计基础(C语言)wh,第 6 章,函数和模块设计,6.1,结构化程序设计,6.2 函数的定义和调用,6.3,程序嵌套调用和递归调用,6.4,作用域和存储类型,6.5,内部函数和外部函数,6.6,模块化程序设计,6.7,应用举例,12/8/2025,2,程序设计基础(C语言)wh,对大千世界的许多描述大都可以在计算机中运用程序设计中的函数问题来解决,C语言程序设计也不例外。,一个功能较大的系统,它一定包含有若干个相对独立的子功能,通过子程序模块来描述这些子功能,再通过对这些子程序的组织和调用,来实现整个程序的功能要求。而这些功能比较独立的子程序模块则称之为函数,。本章用于揭开函数的真面目!,12/8/2025,3,程序设计基础(C语言)wh,6.1 结构化程序设计,6.1.1 结构化程序设计的基本概念,结构化程序设计基本思想:,将一个大的程序按功能分割成一些子模块,再通过对这些子模块的组织和调用,来实现整个程序的功能要求。,12/8/2025,4,程序设计基础(C语言)wh,#include stdio.h,void main(),float a,b,c,v;,scanf(”%f,%f,%f”,v=volume(a,b,c);,print_message();,float volume(float a,float b,float c),float v;,v=a*b*c;,return(v);,void print_message(),printf(”v=%f”,v);,输出体积,组织和调用,计算立方体,示例:编程序计算一立方体的体积,并在屏幕上输出。,12/8/2025,5,程序设计基础(C语言)wh,6.1 结构化程序设计,6.1.1 结构化程序设计的基本概念,结构化程序设计特点:,各模块相对独立、功能单一、结构清晰;,控制了程序设计的复杂性;,提高元件的可靠性,缩短开发周期;,避免程序开发的重复劳动;,易于维护和功能扩充;,开发方法:自上向下,逐步求精,,模块化,,,限制使用goto语句。,12/8/2025,6,程序设计基础(C语言)wh,3.,程序设计采用自顶向下逐步细化过程,工资计算程序,工资计算,信息输入,工资额计算,工资表打印,应发部分,扣除部分,基本工资,其他补贴,水电、公积金,12/8/2025,9,程序设计基础(C语言)wh,6.2 函数的定义和调用,函数是,C,语言程序的一种基本组成部分,,C,语言程序的功能是通过函数之间的调用来实,现,一个完整的,C,语言程序可由一个或多个函,数组成。,0;-x),y=y*x;,return,(y),;,传统式,例 有参函数,long facto,(int x),long y;,for(y=1;x0;-x),y=y*x;,return,(y),;,现代式,函数类型 函数名,(,形参类型说明表,),说明部分,语句部分,现代格式,函数返回值类型,缺省,int,型,无返回值,void,合法标识符,可以为空,也可以有多个参数,函数体,例 无参函数,void print_message,(),printf(”v=%f”,v);,例 空函数,myfile,(),函数体为空,12/8/2025,13,程序设计基础(C语言)wh,6.2 函数的定义和调用,6.2.2 函 数 的 调 用,一.,函数调用格式及执行过程,调用形式,函数名(实参列表);,说明:,实参与形参,个数相等,类型一致,按顺序一一对应;,实参列表求值顺序,因系统而定(Turbo C,自右向左,);,实参的量可以是常量、有值的变量或运算表达式.,12/8/2025,14,程序设计基础(C语言)wh,#include stdio.h,void main(),int i=1,n;,n=,f(,i,+i,),;,printf(”nn=%dn”,n);,f(,int a,int b,),int c;,if(a=b),c=1;,else,c=0;,return(c);,自右向左顺序,#include stdio.h,void main(),int i=1,n;,n=,f(,i,+i,),;,printf(”nn=%dn”,n);,f(,int a,int b,),int c;,if(a=b),c=1;,else,c=0;,return(c);,自左向右顺序,【例6_3】,实参求值顺序举例。,运行结果:,n=0,运行结果:,n=1,i(1),+i(2),a(1),b(2),c=0;,i(2),+i(2),a(2),b(2),c=1;,12/8/2025,15,程序设计基础(C语言)wh,函数调用语句的执行过程:,首先计算每个实参表达式的,值,并把此值存入所对应,的形参单元中,,执行流程转入函数体,执行函数体中的各语句。,函数体执行完之后,return(c)返回到调用该函数的,函数中的调用处的下一条语,/*计算面积*/,#include stdio.h,void main(),int x=5,y=4,s=0;,s=,f(,x,y,),;,printf(”ns=%dn”,s);,f(,int,a,int b,),c=a*b;,return(c);,x=5,y=4,a=5,b=4,c=5*4=20,s=20,运行结果:,s=20,12/8/2025,16,程序设计基础(C语言)wh,二.,函 数 的 调 用 方 式,3.以函数调用中的一个实际参数形式调用,例如,k=hust(,hust(m,n),j);,printf(”%d”,power(a,b),);,2.以函数表达式的一个运算对象形式调用,例如,k=,hust(m,n),*,hust(i,j);,1.以函数调用语句形式调用,例如,hust(),;,12/8/2025,17,程序设计基础(C语言)wh,三.,对被调用函数的使用说明,在程序中调用另一个函数时,要满足以下三个条件:,被调用函数可以是已存在的用户自定义函数或库函数。,#include stdio.h,void main(),int x=5,y=4,s=0;,s=,f(,x,y,),;,printf(”ns=%dn”,s);,f(,int a,int b,),c=a*b;,return(c);,用户自定义函数,库函数,若是库函数,应用#include命令将有关库函数所需的信息包含到本文件中,#include stdio.h,void main(),printf(“*”);,若是用户自定义的函数,且该函数与调用它的函数(即调用函数)在同一个源,文件中,则在调用函数中应对被调用函数返回值的类型加以说明。,12/8/2025,18,程序设计基础(C语言)wh,#include stdio.h,void main(),float volume(float a,float b,float c),float x,y,z,v;,scanf(”%f%f%f”,v=,volume(,x,y,z,),;,printf(”v=%fn”,v);,float volume(,float,a,float b,float,c,),float d;,d=a*b*c;,return(d);,【例6_4】,求长方形体积的程序。,对自定义函数volume说明,调用自定义函数volume,12/8/2025,19,程序设计基础(C语言)wh,6.2 函数的定义和调用,6.2.3 函数的,返回值,返回语句形式,return(,表达式);,说明:,系统默认的返回值类型为,int,型,当函数有返回值时,凡是允许表达式出现的地方,都可以调用该函数,当函数没有返回值时,函数的返回值类型可以说明为,void,型,(,空类型,),若无,return,语句,遇,时,自动返回调用函数,函数中可有多个,return,语句,或,return,表达式;,或,return,;,功能,:,利用,return,语句,将计算结果,(,或不带结果,),返回给调用程序,同时,也使程序的执行流程转到调用语句的下一语句去执行。,12/8/2025,20,程序设计基础(C语言)wh,float count(,int,n,),int i;,float s;,if(n=0);,printf(”The%d is invalid”,n);,return(0);,else,s=0;,for(i=1;i=n;i+),s+=1/(float)i;,return(s);,【例6_5】,编一函数,求112131n的值。,强制转换成实型,12/8/2025,21,程序设计基础(C语言)wh,void spc(,int,n,),int i;,for(i=0;in;i+),printf(”%c”,);,return(0);,【例6_6】,打印n个空格的函数。,void spc(,int,n,),int i;,for(i=0;in;i+),printf(”%c”,);,返回调用函数,或,12/8/2025,22,程序设计基础(C语言)wh,void line(,int,n,),line(,int n,),int i;,for(i=1;i=n;i+),printf(”%c”,-);,return;,调用该函数:,printf(”%d”,line(30);,当无返回值的函数将,void,省掉时,,函数将返回一个不确定的值。,例如,:,输出一段虚线的同时,还输出line函数的返回值,它是一个不确定的值。,引起编译错误,12/8/2025,23,程序设计基础(C语言)wh,double power(,float,x,int n,),int i;,double pw;,pw=l;,for(i=1;i=n;i+),pw*=x;,return pw;,【例6_7】,编一函数,求x的n次方的值,其中n是整数,。,将,x、n,做为,函数参数,结果通过,return语句,返回调用程序,12/8/2025,24,程序设计基础(C语言)wh,to_str(,int,n,),char str10;,int i;,if(n0);,while(-i=0),putchar(stri);,【例6_8】,将一个给定的整数转换成相应的字符串后显示出来。,将数值型的数据转换成数值字符的内码,12/8/2025,25,程序设计基础(C语言)wh,正确的形参定义,int hust(,a,b,),int a,b;,int hust(,int,a,int b,),或,错误的形参定义,int hust(,int,a,b,),int b;,int hust(,int a,b,),或,6.2 函数的定义和调用,6.2.4,函数参数及函数间的数据传递,形式参数:定义函数时函数名后面括号中的变量名。,实际参数:调用函数时函数名后面括号中的表达式。,例如,形参与实参,实参的定义,s=,hust(,x,y,),;,12/8/2025,26,程序设计基础(C语言)wh,/*计算面积*/,#include stdio.h,void main(),int x=5,y=4,s=0;,s=,f(,x,y,),;,printf(”ns=%dn”,s);,f(,int a,int b,),c=a*b;,return(c);,实参,形参,s=f(x,y);,(,main 函数,),(,f 函数,),f(int a,int b),c=a*b;,return(c);,12/8/2025,27,程序设计基础(C语言)wh,6.2 函数的定义和调用,6.2.4,函数参数及函数间的数据传递,形式参数:定义函数时函数名后面括号中的变量名。,实际参数:调用函数时函数名后面括号中的表达式。,形参与实参,说明:,实参可以是常量、已赋值的变量或表达式。,实参在次序、类型和个数上应与相应形参表中的形参保持一致。,通常,当需要从调用函数中传值,(,或传地址,),到被调用函数中的形参时应设置实参。,12/8/2025,28,程序设计基础(C语言)wh,6.2 函数的定义和调用,6.2.4,函数参数及函数间的数据传递,值的传递,:调用函数将实参,(,常数、变量、数组元素或可计算,的表达式,),的值传递到被调用函数形参设置的临时变量存储,单元中,被调用函数形参值的改变对调用函数的实参没有,影响。调用结束后,形参存储单元被释放,实参仍保持原,值不变。,传递形参值的两种方法,特点,:,形参与实参占用,不同,的内存单元,.,单向,传递,12/8/2025,29,程序设计基础(C语言)wh,#include stdio.h,void main(),int i=25;,printf(”The value of i in main()before calling sqr(x)is%dn”,i);,printf(”Calling sqr(x):sqr(%d)=%dn”,i,sqr(,i,),);,printf(”The value of i in main()after calling sqr(x)is%dn”,i);,sqr(,int x,),x=x*x;,return(x);,【例6_9】,值的传递程序举例,实参值复制给形参,25,i:,调用前:,调用:,25,x:,25,i:,运行结果:,The value of i in main()before calling sqr(x)is 25,Calling sqr(x):sqr(25)=625,The value of i in main()after calling sqr(x)is 25,sqr:,25,i:,625,2525,x:,25,i:,调用结束:,结论:,在值的传递调用中,只是实参的复制值被传递,,被调用函数中的操作不会影响实参的值。,12/8/2025,30,程序设计基础(C语言)wh,6.2 函数的定义和调用,6.2.4,函数参数及函数间的数据传递,地址的传递,:调用函数将实参,(,数组名或指针型变量,),的地址,作为参数传递给形参。若实参是数组名,则调用函数将实参,数组的起始地址传递给形参的临时变量单元;若实参是指针,变量或地址表达式,则调用函数将实参指针变量所指向单元,的地址或实参的地址传递给形参的临时变量存储单元。,传递形参值的两种方法,特点,:,形参与实参占用,相同,的内存单元,.,双向,传递,实参和形参必须是,地址,常量或变量,12/8/2025,31,程序设计基础(C语言)wh,void f(,int b,),int max,max_i,i;,max=b0,max_i=0;,for(i=0;i10;i+),if(maxbi),max=bi;max_i=i;,max=b0;,b0=bmax_i;,bmax_i=max;,return;,#include stdio.h,void main(),void f(int b);,int a10,i;,for(i=0;i10;i+),scanf(”%d”,f(,a,);,for(i=0;i10;i+),printf(”n%4d”,ai);,【例6_11】将数组中的最大元素值与第一个元素值交换,运行结果:,0 1 2 3 4 5 6 7 8 9,9 1 2 3 4 5 6 7 8 0,调用前,0,a,9,b,调用,0,a,9,交换,b,9,a,0,返回,9,a,0,结论:,在地址的传递调用中,数组b与数组a共用同一存储空间。,所以被传递的数据在被调用函数中对存储空间的值做出某种,变动后,必然会影响到使用该空间的调用函数中变量的值。,实参数组的,起始地址,传递给形参,12/8/2025,32,程序设计基础(C语言)wh,6.2 函数的定义和调用,6.2.4,函数参数及函数间的数据传递,一、,非数组名作为函数参数,参数传递的两种形式,当非数组名作为函数参数,在函数调用时,,C,语言,编译系统根据形参的类型为每个形参分配存储单元,并,将实参的值复制到对应的形参单元之中,形参和实参分,别占用不同的存储单元,且形参值的改变不影响与其对,应的实参,即按“值的传递”方法操作。,12/8/2025,33,程序设计基础(C语言)wh,f(,int,a,int,b,),a=a+2;,b=b+4;,printf(”a=%d,b=%dn”,a,b);,return(a);,#include stdio.h,void main(),int f(,int,a,int,b,);,int x=1,y=2,z;,static int a=0,1,2,3,4;,z=,f(,x,y,),;,printf(”z=%d,x=%d,y=%dn”,z,x,y);,z=,f(,a3,a4,);,printf(”z=%d,a3=%d,a4=%dn”,z,a3,a4);,z=,f(,x,y+1,);,printf(”z=%d,x=%d,y=%dn”,z,x,y);,【例6_12】,非数组名作为参数的值的传递程序举例,运行结果:,a=3,b=6,z=3,x=1,y=2,a=5,b=8,z=5,a3=3,a4=4,a=3,b=7,z=3,x=1,y=2,12/8/2025,34,程序设计基础(C语言)wh,6.2 函数的定义和调用,6.2.4,函数参数及函数间的数据传递,二、,数组名作为函数参数,参数传递的两种形式,单个数组元素可以作为函数参数,这同非数组名作为,函数参数的情形完全一样,即遵守”值传递”方式。,12/8/2025,35,程序设计基础(C语言)wh,1、,数组名作为函数参数的表示方法,当数组名作为函数参数时,需要对其类型进行相应的说明,例如,int,test(,int,array,10,),.,若数组说明时不指定数组的长度,,可用另一个参数来表示数组的长度,例如,int,test(,int,array,,,int,n,),.,用形参,n,来表示,array,数组的实际长度,更灵活,12/8/2025,36,程序设计基础(C语言)wh,int solve(,int a,int n,),int sum,i;,sum=0;,for(i=0;i,n,;i+),if(,ai,!=0),sum+;,return(sum);,【例6_13】,编一函数,用来统计一个一维数组中非0元素的个数,用形参,n,来表示,a,数组的实际长度。,12/8/2025,37,程序设计基础(C语言)wh,1、,数组名作为函数参数的表示方法,当多维数组名作为函数参数时,除第一维可以不指定长,度外,其余各维都必须指定长度。,例如,check(,float a 10,float,n,),.,下面的参数说明都是不正确的:,例如,float a ;,或,float a10;,.,12/8/2025,38,程序设计基础(C语言)wh,说明:,用数组名作为函数参数时,应该在调用函数和被调用函数,中分别定义数组。,实参数组和形参数组类型应一致,否则出错。,形参数组的大小应大于等于实参数组的大小,否则得不到,实参数组的全部值。,特别注意的是,数组名作为函数参数时,是将实参数组,的首地址传给形参数组,两数组的对应元素占用同一内,存单元。传递时按数组在内存中排列的顺序进行。,12/8/2025,39,程序设计基础(C语言)wh,2、,数组名作为函数参数的传递方式,数组名作为函数参数时,不是采用“值传递”方式,,而是采用“地址传递”方式。,这意味着形参数组中某一元素的改变,将直接影响到,与其对应的实参数组中的元素。,12/8/2025,40,程序设计基础(C语言)wh,void sort(,int array10,),int i,j,k,t;,for(i=0;i9;i+),k=i;,for(j=i+1;j10;j+),if(arrayjarrayk)k=j;t=arrayk;,arrayk=arrayi;,arrayi=t;,#include stdio.h,void main(),int x10,i;,void sort(int array10);,for(i=0;i10;i+),scanf(”%d,”,sort(,x,);,printf(”The sorted array:n”);,for(i=0;i10;i+),printf(”%d,”,xi);,printf(”n”);,【例6_14】,将一个10个元素的一维数组用函数调用实现选择排序。,9,8,7,6,5,4,3,2,1,0,The sorted array:,0,1,2,3,4,5,6,7,8,9,调用前,9,x,0,0,9,调用,9,x,0,0,9,array,交换,0,x,9,0,9,array,返回,0,x,9,0,9,scanf(”%d,”,寻,找,排,序,12/8/2025,41,程序设计基础(C语言)wh,6.3,嵌套调用和递归调用,C语言中的函数定义是互相独立的,函数和函数之间,没有从属关系,即一个函数内不允许包含另一个函数的定,义。一个函数既可以被其他函数调用,同时,它也可以调,用别的函数,这就是函数的嵌套调用。函数的嵌套调用为,自顶向下、逐步求精及模块化的结构化程序设计技术提供,了最基本的支持。,=0),break;,result=,fact(,n,),;,printf(”Result=%ld”,result);,【例6_16】,从键盘输入一非负整数n,并求出n!的值。,n!=n*(n-1)!,结果分析:,n=4 f(4)=4*fac(4-1),=3 f(3)=3*fac(3-1),=2 f(2)=2*fac(2-1),=1 f(1)=1*fact(1-1),=0 f(0)=1,回推,递推,运行情况:,Input a number:,4,Result,=24,递归调用,嵌套调用,if(n=0),/*递归终止条件*/,f=1;,递归过程的两个阶段:,fact(4),是主函数调用的。在一次调用,fact,函数时,并不是立即得到,fact(4),的值,而是一次又一次地,进行递归调用(,回推,),直到,fact(1),时才有确定的值。,之后,再,递推,出,fact(2),、,fact(3),、,fact(4),的值。,12/8/2025,46,程序设计基础(C语言)wh,double xpower(,float x,int n,),if(n=0),return(1);,else,return(x*,xpower(,x,n-1,),);,#include stdio.h,void main(),double xpower(float x,int n);,float x;,int n;,double r,scanf(”%f%d”,r=,xpower(,x,n,),;,printf(”Result=%f”,r);,【例6_17】,编一程序,利用函数的递归调用求x的n次方的值,其中n为正整数。,运行情况:,2,3,Result,=8,小结:,任何有意义的递归调用总是由两部分组成:,即,递归方式,与,递归终止条件,。,if(n=0),/*递归终止条件*/,return(1);,12/8/2025,47,程序设计基础(C语言)wh,6.4,作用域和存储类型,变量是对程序中数据的存储空间的抽象,变量的属性,数据类型:变量所持有的数据的性质(,操作属性,),存储属性,存储器类型:寄存器、静态存储区、动态存储区,生存期,:变量在某一时刻存在,静态变量与动态变量,作用域,:变量在某区域内有效,局部变量与全局变量,变量的存储类型,auto,自动型,register,寄存器型,static,静态型,extern,外部型,变量定义格式:,存储类型定义符,数据类型 变量名表,;,如:int sub;,auto,int x,y,z;,register,int n;,static,float a,b;,12/8/2025,48,程序设计基础(C语言)wh,6.4,作用域和存储类型,6.4.1,局部变量及其存储类型,定义,在,函数,或,复合语句,内部定义的变量称为,局部变量,。,说明,主函数,main,中定义的变量也只在主函数中有效,其它函数不能引用;,不同函数中可以使用相同名字的变量,它们代表不同的对象,占用不同的内存单元,互相独立;,形式参数,也是局部变量;,可以在,复合语句,中定义变量,其作用域只是本复合语句。,12/8/2025,49,程序设计基础(C语言)wh,float hust1(,int,a,),int x,y;,举 例,局部变量a、x、y的作用范围,float hust2(int b,int c),char s;,局部变量b、c、s的作用范围,void,main(),int m,n;,局部变量m、n的作用范围,12/8/2025,50,程序设计基础(C语言)wh,举 例,#include”stdio.h”,void main(),int p,q;,int x;,x=p+q;,x 的有效范围,p、q,的有效范围,12/8/2025,51,程序设计基础(C语言)wh,6.4,作用域和存储类型,6.4.1,局部变量及其存储类型,1.,自动存储变量,auto,自动存储,变量,在函数或复合语句中定义和说明的变量,通常称为自动变量。自动变量前可以冠以“,auto,”,若变量前不加任何存储类别说明,则按,缺省规则都为自动存储类别,的变量。,作用域:,自动变量通常是局部变量,它的作用域仅限于定义它的那个函数或复合语句。它的可见性与生存期和作用域相同。,auto,float a;,float a;,或,12/8/2025,52,程序设计基础(C语言)wh,【例6_18】,不同函数中的同名变量,#include stdio.h,void main(),int a;,a=0;,data(,),;,a=a+100;,printf(”main:a=%dn”,a);,data(),int a;,a=-199;,printf(”data:a=%dn”,a);,运行结果:,data:a=-199,main:a=100,不指定为,auto,型,不指定为,auto,型,#include stdio.h,void main(),int a;,a=,1,;,data(,),;,a=a+100;,printf(”main:a=%dn”,a);,data(),int a;,printf(“da=%dn,a);,a=-199;,printf(”data:a=%dn”,a);,运行结果:,da=1,data:a,=,199,main:a,=101,12/8/2025,53,程序设计基础(C语言)wh,【例6_18】,不同函数中的同名变量,#include stdio.h,void main(),int a;,a=,10,;,printf(“ma=%d,%xn,a,&a,);,data(,),;,a=a+100;,printf(”main:a=%dn”,a,&a,);,data(),int a;,printf(“da=%dn,a,&a,);,a+=1;,printf(“daa=%d,%xn,a,&a,);,a=-199;,printf(”data:a=%dn”,a,&a,);,运行结果:,ma=10,ffdc,da=404,ffd6,daa=405,ffd6,data:a,=,199,ffd6,main:a,=110,ffdc,12/8/2025,54,程序设计基础(C语言)wh,6.4,作用域和存储类型,6.4.1,局部变量及其存储类型,2.,静态局部变量,static,如果希望在函数调用结束后仍然保留函数中定义的局部变量的值,则可以将该局部变量定义为静态局部变量。,静态局部变量前可以冠以“,static,”,例如 static,int t,s;,说明:,静态局部变量的作用域在定义它的函数内部,它的值在函,数调用结束后并不消失,但其他函数仍然不能访问它。,静态局部变量赋初值是在编译过程中进行的,,且只赋一次,初值,。而且连续保留上一次函数调用时的结果,。,静态局部变量的默认初值数值型为,0,,字符型为,Null,12/8/2025,55,程序设计基础(C语言)wh,【例6_19】,编一程序,观察静态局部变量在调用过程中的情况。,#include stdio.h,void test(),static int a=0;,printf(”a=%dn”,a);,+a;,void main(),int i;,for(i=0;i4;i+),test();,运行结果:,a=0,a=1,a=2,a=3,12/8/2025,56,程序设计基础(C语言)wh,#include,int func(,int a,int,b,),static int m=0,i=0;,i+=m+1;,m=i+a+b;,return(m);,main(),int k=3,m=2,p;,p=,func(,k,m,);,printf(“p1=%dn”,p);,p=,func(,k,m,);,printf(“p2=%dn”,p);,运行结果:,p1=,课堂练习:,看程序写结果,*i=i+(m+1)=0+(0+1)=1*,*m=1+3+2=6*,*i=i+(m+1)=1+(6+1)=8*,*m=8+3+2=13*,6,p2=,13,12/8/2025,57,程序设计基础(C语言)wh,6.4,作用域和存储类型,6.4.1,局部变量及其存储类型,3.,寄存器变量,register,为提高程序的运行速度,可将使用十分频繁的局部变量说明为寄存器变量,即在局部变量前冠以,register,,告知编译系统将其存储在,CPU,的寄存器中,void test_r(,register,int n,),register,char c;,.,说明:,变量的存储类型为寄存器变量时,,auto,说明符可省,冠以,register,说明符即可,寄存器变量的使用与机器的硬件特性有关,有一些限制:,如寄存器变量的个数;,它只适用于自动变量和函数的形参;,它的类型只能是,char,、,short,int,、,unsigned,int,、,int,和,指针型,;,不允许对寄存器变量取地址等。,Turbo C,中寄存器变量只能用于,整型,和,字符型,,且限制最多只允许定义,两个,寄存器变量。一旦超过,系统就自动地将其余的作为非寄存器变量来处理。,12/8/2025,58,程序设计基础(C语言)wh,i的作用范围,【例6_20】,输出1到5的阶乘的值。,#include stdio.h,void main(),int fac(int n);,int i;,for(i=1;i=5;i+),printf(”%d!=%dn”,i,fac(,i,),);,int fac(,int,n,),register,int i,f=1;,for(i=1;i=n;i+),f=f*i;,return(f);,运行结果:,1!=1,2!=2,3!=6,4!=24,i、f的作用范围,5!=120,12/8/2025,59,程序设计基础(C语言)wh,【例6_21】,编一程序,输入10名学生的成绩,并求出平均成绩,#include stdio.h,float ascore(,float,a,int,n,),register,int i;,float sum;,sum=0;,for(i=0;in;i+),sum+=ai;,return(sum/n);,void main(),float array10;,register,int i;,for(i=0;i10;i+),scanf(”%f”,printf(”Average score=%f”,;,ascore(,array,10,),);,i的作用范围,i的作用范围,12/8/2025,60,程序设计基础(C语言)wh,6.4,作用域和存储类型,6.4.2,全局变量及其存储类型,定义,一个源程序文件可以包含一个或若干个函数。,在函数之外定义的变量称为全局变量或全程变量(又称外部变量)。,全局变量,与,局部变量,的区别:,全局变量,在函数之外定义,,局部变量,在函数之内定义;,局部变量,在本函数之内有效,,全局变量,从定义变量的位置开始到本源文件结束均有效。,编译时,全局变量,分配在静态存储区,而,局部变量,则不一定,。,12/8/2025,61,程序设计基础(C语言)wh,【例6_22】,编一程序,打印九九表,#include stdio.h,void row();,int a=1;,/*外部变量*/,void main(),int k;,for(k=1;k=9;+k,+a),row();,void row(),int b;,for(b=1;b=a;+b),printf(”%4d”,a*b);,printf(”n”);,k的有效范围,b的有效范围,作用域,a,12/8/2025,62,程序设计基础(C语言)wh,6.4,作用域和存储类型,6.4.2,全局变量及其存储类型,1.,外部变量,extern,外部,变量,没有说明为,static,的全局变量,其存储类型都是外部的,统称为外部变量。,外部变量说明,extern,数据类型 变量表;,注意:,凡在函数外定义的全局变量,按缺省规则可以不写说明,extern,,,但在函数体内说明其后所定义的全局变量时,要冠以,extern,。,若一个文件要引用另一个文件中的全局变量,应该在需要引用该,变量的文件中,用,extern,说明该变量为外部的全局变量。,12/8/2025,63,程序设计基础(C语言)wh,【例6_23】,编一程序,打印九九表,#include stdio.h,void row();,void main(),int k;,for(k=1;k=9;+k,+,a,),row();,int a=1;,/*定义外部变量*/,void row,(),int b;,for(b=1;b=a;+b),printf(”%4d”,a*b);,printf(”n”);,作用域,a,作用域,a,扩展,extern int a;/*说明外部变量*/,extern,只能用来说明变量,而不能用来定义变量。,12/8/2025,64,程序设计基础(C语言)wh,例如,在不同的文件中引用外部变量,文件f1.c的内容:,#include “f2.c”,int x;/*外部变量定义*/,main(),int sum,y;,scanf(“%d”,store();,sum=x+y;,printf(“sum=%d”,sum);,文件f2.c的内容:,extern int x;,/*外部变量引用说明*/,void store(),x=10;,12/8/2025,65,程序设计基础(C语言)wh,6.4,作用域和存储类型,6.4.2,全局变量及其存储类型,2.静态,外部变量,static,静态全局变量一定是在本文件中定义的全局变量,其存,储类型说明符是,static,。,静态全局变量的作用域是其,定义点开始到该文件的结束,,在本文件外不能访问。,这种全局变量起到一个屏蔽作用。也可以对函数定义成,静态的,来限制函数的作用域。,静态外部变量,与,外部变量,的相同与区别:,两者都是在,静态存储区,中分配单元;,外部变量,不仅在本函数之内使用,还可以用于其他函数,但,静态外部变量,则不能用于其他函数;,12/8/2025,66,程序设计基础(C语言)wh,例如,下面对静态全局变量的引用是错误的:,file1.c,static int,a,;,/*静态外部变量定义*/,main(),a=1;,printf(”%dn”,f(,a,),);,file2.c,extern int a;,/*,静态,外部变量引用说明*/,int f(,int,x,),x=,a,+x;,printf(”%d,n”,x);,return(x);,即使使用了,extern,说明,也无法使用该变量。,12/8/2025,67,程序设
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服