收藏 分销(赏)

C语言函数省公共课一等奖全国赛课获奖课件.pptx

上传人:w****g 文档编号:4153720 上传时间:2024-08-05 格式:PPTX 页数:99 大小:538.66KB
下载 相关 举报
C语言函数省公共课一等奖全国赛课获奖课件.pptx_第1页
第1页 / 共99页
C语言函数省公共课一等奖全国赛课获奖课件.pptx_第2页
第2页 / 共99页
C语言函数省公共课一等奖全国赛课获奖课件.pptx_第3页
第3页 / 共99页
C语言函数省公共课一等奖全国赛课获奖课件.pptx_第4页
第4页 / 共99页
C语言函数省公共课一等奖全国赛课获奖课件.pptx_第5页
第5页 / 共99页
点击查看更多>>
资源描述

1、第四章函数概述概述函数函数定义定义函数函数调用及返回调用及返回函数函数参数及其传递方式参数及其传递方式函数嵌套与递归函数嵌套与递归变量作用域变量作用域变量生存期变量生存期内部函数和外部函数内部函数和外部函数编译预处理命令编译预处理命令第1页n主要内容:主要内容:函数定义,函数参数、函数值,函数调用。函数定义,函数参数、函数值,函数调用。函数嵌套调用,递归调用,局部变量和全局变量,动态、静函数嵌套调用,递归调用,局部变量和全局变量,动态、静态存放变量。内部函数和外部函数。宏定义,文件包含,条态存放变量。内部函数和外部函数。宏定义,文件包含,条件编译。件编译。n重点重点:掌握函数调用,掌握嵌套调用

2、,掌握递归调用、动掌握函数调用,掌握嵌套调用,掌握递归调用、动态、静态存放变量、局部变量、全局变量。掌握宏定义,掌态、静态存放变量、局部变量、全局变量。掌握宏定义,掌握文件包含。握文件包含。n难点:难点:递归调用,静态存放变量,局部变量,全局变量。递归调用,静态存放变量,局部变量,全局变量。带参数宏定义。带参数宏定义。第四章函数第2页4.1函数概述函数概述引例引例1:求圆面积和周长。(书:求圆面积和周长。(书P106例例4.1)(需返回值需返回值)#includefloats(floatr)floatres;res=3.14*r*r;returnres;floatl(floatbj)float

3、res;res=2*3.14*bj;returnres;main()floatr,area,circle;printf(“Pleaseinputradius:”);scanf(“%f”,&r);lt4_01area=s(r);circle=l(r);printf(“r=%f,s=%f,l=%fn”,r,area,circle);第3页引例引例2:(不需返回值不需返回值)#includeprint_point()printf(“n”);print_message()printf(“ThisisaCprogram!n”);main()print_point();print_message();pr

4、int_point();ch4_yl第4页模块化程序设计模块化程序设计l基本思想:基本思想:将一个大程序按将一个大程序按功效功效分割成一些分割成一些小模块小模块n开发方法开发方法:自顶向下,逐步分解,分自顶向下,逐步分解,分而治之而治之输入输入信息信息返回返回信息信息main().f1();.f2();f1().f11();.f2().f21();.f22();.f11().f21().f22().程序各函数在逻辑关系上形成程序各函数在逻辑关系上形成自上而下自上而下结构结构main()f1()f2()f11()f21()f22()第5页对程序和函数关系,有以下几点说明:对程序和函数关系,有以下

5、几点说明:1一个一个C程序程序由一个或多个由一个或多个源程序文件源程序文件组成;一个组成;一个源程序文源程序文件件由一个或多个由一个或多个函数函数组成。组成。函数函数是是C程序程序基本组成单位。基本组成单位。2一个一个C程序程序执行执行总是总是从从main()函数函数开始开始,调用其它函数后,调用其它函数后,流程返回到流程返回到main()函数,在函数,在main()函数中结束整个程序运行;函数中结束整个程序运行;main()函数由系统定义,是程序中必不可少一个函数。函数由系统定义,是程序中必不可少一个函数。3全部函数都是全部函数都是平行平行,在定义时都是相互独立,一个函数,在定义时都是相互独

6、立,一个函数并并不隶属于不隶属于另一个函数,函数间能够相互调用,但不能调用另一个函数,函数间能够相互调用,但不能调用main()。4函数分类:函数分类:从用户使用角度从用户使用角度:*标准函数(即系统库函数)标准函数(即系统库函数)*用户自定义函数。用户自定义函数。从函数形式看从函数形式看:*无参函数无参函数*有参函数有参函数(依据主调与被调函数有没有参数传递依据主调与被调函数有没有参数传递)第6页例例4.2定义一个求和函数。书定义一个求和函数。书P108floatsum(floatx,floaty)floatz;z=x+y;return(z);4.2函数定义函数定义第7页例例有参函数有参函数

7、intmax(intx,y)intz;z=xy?x:y;return(z);例例无参函数无参函数printstar()printf(“*n”);或或printstar(void)printf(“*n”);函数定义格式函数定义格式正当标识符正当标识符函数返回值类型函数返回值类型缺省缺省int型型无返回值无返回值void函数体函数体函数类型函数类型函数名函数名(形式参数表形式参数表)说明部分说明部分语句部分语句部分例例有参函数有参函数intmax(intx,inty)intz;z=xy?x:y;return(z);例例空函数空函数dummy()函数体为空函数体为空函数函数不能嵌套定义不能嵌套定义m

8、ain().intadd(intx,inty)intz;z=x+y;returnz;.类型名类型名1形式参数名形式参数名1,类型名,类型名2形式参数名形式参数名2,第8页4.3函数调用与返回值函数调用与返回值调用格式:调用格式:函数名(实际参数表)函数名(实际参数表)第9页例例4.3经过函数调用求两数中最小值。书经过函数调用求两数中最小值。书P109#includemin(intx,inty)intz;z=xy?x:y;return(z);形参形参实参实参2.说明:说明:(1)(1)实参实参可是可是常量、变量、表示常量、变量、表示式式,但必须有,但必须有确定确定值值;(2)(2)形参形参在函数

9、未调用之前是不在函数未调用之前是不存在,存在,只有只有发生发生函数调用函数调用时,时,形参才被分配内存单元形参才被分配内存单元。调用结束调用结束后,后,形参所占形参所占内存内存单元被自动单元被自动释放释放。即函数中。即函数中形参是有生命期。形参是有生命期。第12页4.3.2函数调用函数调用一、普通形式:一、普通形式:1.1.函数名(实际参数表)函数名(实际参数表)2.2.说明说明:调用调用无参函数无参函数时,实参列表可无,但时,实参列表可无,但括弧不能省括弧不能省;如:如:getchar()getchar()print_point()print_message()多个实参时,多个实参时,实参实

10、参间间用,分隔用,分隔;实参加形参要实参加形参要个数相等个数相等,类型一致类型一致,按次序,按次序一一对应一一对应,传递数据。传递数据。第13页二、调用方式:二、调用方式:(按函数在程序中出现位置来看)按函数在程序中出现位置来看)分三种:分三种:1.1.函数函数语句语句把把函数调用作为一个语句。函数调用作为一个语句。如例如例4.1中中print_point();printf();和和 scanf();2.函数函数表示式表示式函数调用出现在一个表示式中。函数调用出现在一个表示式中。如:如:c=min(a,b);3.3.函数函数参数参数函数调用作为一个函数实参。函数调用作为一个函数实参。如:如:n

11、=min(a,min(b,c);及及printf(“%d”,min(a,b);第14页4.3.3对被调用函数申明对被调用函数申明一、一、调用调用系统系统库函数库函数 应在程序文件开头用应在程序文件开头用#include#include命令将包含库函命令将包含库函数定义信息数定义信息“头文件头文件”嵌入到本文件中来。嵌入到本文件中来。如:如:#include#include 二、二、调用调用用户用户自定义函数自定义函数 普通应在普通应在主调函数中对被调函数进行主调函数中对被调函数进行“申明申明”。第15页main()floata,b,c;scanf(“%f,%f”,&a,&b);c=sum(a,

12、b);printf(“Sumis%fn”,c);floatsum(floatx,floaty)floatz;z=x+y;return(z);分析:分析:编译是从上到下逐行进行,若编译是从上到下逐行进行,若无无函数申明函数申明,编译到,编译到c=sum(a,b);时时不知道不知道sumsum是不是函数名;是不是函数名;无法判断实参无法判断实参(a,b)(a,b)类型、类型、个数是否正确。个数是否正确。用用函数原型函数原型对函数调用正当对函数调用正当性进行全方面检验,与函数原性进行全方面检验,与函数原型不匹配函数调用会造成编译型不匹配函数调用会造成编译犯错。犯错。floatsum(floatx,f

13、loaty);例例4.4经过调用自定义函数求两数和。经过调用自定义函数求两数和。(书书P111)第16页函数原型(函数申明)函数原型(函数申明)有两种写法:有两种写法:(1)类型标识符类型标识符函数名(参数类型函数名(参数类型1参数名参数名1,参数类型,参数类型2参数名参数名2.)(2)类型标识符类型标识符函数名(参数类型函数名(参数类型1,参数类型,参数类型2.)floatsum(floatx,floaty);floatsum(float,float);可不加申明情况可不加申明情况:(1)被调被调函数定义出现函数定义出现在主调在主调函数函数之前;之前;(2)在)在全部函数定义前已全部函数定义

14、前已做了函数做了函数申明申明;(3)函数类型为)函数类型为intint时。时。第17页floatsum(floatx,floaty)floatz;z=x+y;return(z);main()floata,b,c;scanf(“%f,%f”,&a,&b);c=sum(a,b);printf(“Sumis%fn”,c);主主调调函函数数被被调调函函数数第18页charc(int);floatf(float,float);intnumber(char,char);main()charc(int)floatf(floatx,floaty)intnumber(charc1,charc2)无须对被调函数再

15、进行申明无须对被调函数再进行申明例例4.5提前进行函数申明。书提前进行函数申明。书P112第19页4.3.4函数返回语句与返回值函数返回语句与返回值在执行被调用函数时,假如要将控制或被调用函数值返回在执行被调用函数时,假如要将控制或被调用函数值返回给调用函数,则需要使用返回语句。给调用函数,则需要使用返回语句。返回语句有三种格式:返回语句有三种格式:格式格式1:return;格式格式2:return(表示式表示式);格式格式3:return表示式表示式;格式格式1功效:从被调函数功效:从被调函数返回到函数调用点返回到函数调用点,返回时返回时无无返回值返回值。格式格式2和格式和格式3功效:从被调

16、函数功效:从被调函数返回到函数调用点返回到函数调用点,有有返回值返回值,其值就是,其值就是return中表示式值。中表示式值。第20页说明:说明:1.需需返回一个返回一个函数值函数值时,被调函数必须含时,被调函数必须含return,不需不需带回函数值时,带回函数值时,return可有可有可无可无。2.2.没有没有return语句时,并不意味着不带回值,而是不带回语句时,并不意味着不带回值,而是不带回 用户所希望得到值,此值没有用,是一个不确定值。用户所希望得到值,此值没有用,是一个不确定值。3.3.为明确表示为明确表示“不带回值不带回值”,可用,可用void定义定义“无类型无类型”或或 “空类

17、型空类型”,系统确保不使函数带回值。,系统确保不使函数带回值。例:例:void void print_point()4.return后后表示式类型表示式类型应与应与函数类型函数类型一致,一致,如不一致,以如不一致,以函数类型函数类型为准。为准。第21页例例4.6返回类型与函数类型不一致时怎样处理。书返回类型与函数类型不一致时怎样处理。书P113main()intmax(float,float);floata=1.5,b=3.2;printf(“Maxis%dn”,max(a,b);intmax(floatx,floaty)return(xy?x:y);运行结果:运行结果:Maxis3第22页n

18、国考天天练n4月国考二级C语言笔试真题n(26)在C语言中,函数返回值类型最终取决于()nA)函数定义时在函数首部所说明函数类型nB)return语句中表示式值类型nC)调用函数时主函数所传递实参类型nD)函数定义时形参类型A第23页5.C5.C语言要求:语言要求:凡凡不加类型不加类型说明函数,并不代表函数没有返回值,说明函数,并不代表函数没有返回值,而是默认函数返回值为而是默认函数返回值为整型整型。6.6.一个函数中能够有多条一个函数中能够有多条returnreturn语句,执行到哪一语句,执行到哪一个,个,哪一个语句起作用。哪一个语句起作用。第24页#includeIntagn(float

19、);main()floatx;inti;for(i=0;i0)return(1);if(x0)return(-1);return(0);例例4.7有多条语句返回时,怎样处理。书有多条语句返回时,怎样处理。书P115lt4_08第25页4.4.1值传递方式值传递方式特点:仅将实参特点:仅将实参值值传给形参。实参加形参互不影响,传给形参。实参加形参互不影响,在函数内部在函数内部对形参所做任何改变不会影响到实参对形参所做任何改变不会影响到实参,当实参将值传给形参后,它们之间就没有何关系了。当实参将值传给形参后,它们之间就没有何关系了。4.4函数参数传递方式函数参数传递方式实参加形参传递方式有实参加形

20、参传递方式有两种两种:值传递方式和地址传递方式:值传递方式和地址传递方式。第26页n例:用函数交换两个变量值。例:用函数交换两个变量值。main()main()int a,b;int a,b;a=5;b=10;/*a=5;b=10;/*说明两个变量并赋初值说明两个变量并赋初值*/*/printf(brfort swap a=%d,b=%dn,a,b);printf(brfort swap a=%d,b=%dn,a,b);swapswap(a a,b b););/*/*用变量用变量a a和和b b作为实际参数调用函数作为实际参数调用函数*/*/printf(after swap a=%d,b=%

21、dn,a,b);printf(after swap a=%d,b=%dn,a,b);swap swap(int(int x x,int,int y y)int int temptemp;/*;/*借助暂时变量交换两个形参变量值借助暂时变量交换两个形参变量值*/*/temptemp=x;x=y;y=x;x=y;y=temptemp;printf(in swap x=%d,y=%dn,x,y);printf(in swap x=%d,y=%dn,x,y);第27页main main 函数函数 a=5;a=5;b b =10;=10;swapswap(a a,b b););swap(x,(x,y )

22、函数函数 temptemp =x;=x;语句语句 x=x=y y;语句语句 y y =temptemp;语句语句 510实参变量实参变量a实参变量实参变量b510形参变量形参变量x形参变量形参变量y变量变量temp复制复制复制复制temp=xx=yy=temp1055swap函数执行过程和各个变量改变过程函数执行过程和各个变量改变过程调用调用swap函数函数调用调用swap函数函数调用调用swap函数函数执行执行swap函数函数执行执行swap函数函数执行执行swap函数函数第28页该例说明值传递方式特点该例说明值传递方式特点:#includevoidf(intx,inty)/*将形参申明为值

23、传递方式将形参申明为值传递方式*/+x;-y;printf(“nx=%d,y=%d”,x,y);main()inta,b;a=b=10;printf(“na=%d,b=%d”,a,b);f(a,b);/*传值传值*/printf(“na=%d,b=%d”,a,b);运行结果:运行结果:a=10,b=10 x=11,y=9a=10,b=10第29页4.4.2地址传递方式地址传递方式含义:将实参含义:将实参地址地址传给形参。传给形参。形参接收形参接收不是实参值,而是不是实参值,而是实参地址实参地址,所以,被调函数体语句对形参访问,所以,被调函数体语句对形参访问,实际上经过地址而访问到了实参本身,实

24、际上经过地址而访问到了实参本身,自然自然对形参任何修改对形参任何修改,也就是对实参修改也就是对实参修改。第30页地址传递方式地址传递方式#includevoidf(int*x,int*y)+(*x);-(*y);printf(“nx=%d,y=%d”,*x,*y);main()inta,b;a=b=10;printf(“na=%d,b=%d”,a,b);f(&a,&b);/*传地址传地址*/printf(“na=%d,b=%d”,a,b);/*将形参定义为地址传递方式,将形参定义为地址传递方式,即形参为指针类型即形参为指针类型*/*对指针形参访问,实际上就是对指针形参访问,实际上就是对实参访问

25、对实参访问*/运行结果:运行结果:a=10,b=10;x=11,y=9;a=11,b=9;第31页4.5函数嵌套与递归函数嵌套与递归4.5.1函数嵌套调用函数嵌套调用C语言语言不能嵌套定义不能嵌套定义函数,函数,但可嵌套调用但可嵌套调用函数。函数。含义:在调用一个函数过程中,又调用另一个函数,含义:在调用一个函数过程中,又调用另一个函数,可嵌套多层。可嵌套多层。嵌套调用关系以下列图:嵌套调用关系以下列图:第32页例:阅读程序写运行结果。例:阅读程序写运行结果。myfun2(inta,intb)intc;c=a*b%3;returnc;myfun1(inta,intb)intc;a+=a;b+=

26、b;c=myfun2(a,b);returnc*c;main()intx=2,y=7;printf(“Theresultis:%dn”,myfun1(x,y);运行结果:运行结果:Theresultis:4第33页4.5.2函数递归调用函数递归调用嵌套调用:调用另一个不一样函数;嵌套调用:调用另一个不一样函数;递归调用:函数调用递归调用:函数调用本身本身。“直接递归直接递归”:函数:函数a直接调用直接调用a本身;本身;“间接递归间接递归”:函数:函数a调用函数调用函数b,b再调用再调用a。注注:本身调用不能无终止地进行,必须是有限次数、本身调用不能无终止地进行,必须是有限次数、有终止调用。可用

27、有终止调用。可用if语句控制,只有在某一条件成立时语句控制,只有在某一条件成立时才继续递归调用,不然不再继续。才继续递归调用,不然不再继续。第34页(调用点)(调用点)(3!=6)(2!=2)(1!=1)(0!=1)第第1次调用次调用k=33*fac(2)返回值返回值6第第2次调用次调用k=22*fac(1)返回值返回值2第第3次调用次调用k=11*fac(0)返回值返回值1第第4次调用次调用k=0返回值返回值1fac(3)例例4.12用递归计算阶乘用递归计算阶乘K!(书(书P121)第35页floatfac(intk)/*用递归方法计算用递归方法计算k!*/if(k=0)return1;el

28、sereturnk*fac(k-1);/*递归调用函数递归调用函数fac()*/main()intm;printf(“m=”);scanf(“%d”,&m);printf(“%d!=%fn”,m,fac(m);/*调用函数调用函数fac()求阶乘求阶乘*/例例4.12用递归计算用递归计算k!(书(书P119)第36页主函数主函数 第一次第一次调用调用 第二次第二次 第三次第三次 第四次第四次 n=4 n=4 p=fac(4)p=fac(4)调用调用 n=4n=4 r=4*r=4*facfac(3)(3)调用调用 n=3n=3 r=3*r=3*facfac(2)(2)调用调用 n=2n=2 r=

29、2*r=2*facfac(1)(1)n=1 n=1 return(1)return(1)返回返回 r=2*1r=2*1=2=2 returnreturn(2 2)返回返回 r=3*2r=3*2=6=6 returnreturn(6 6)返回返回 r=4*6r=4*6=24=24 returnreturn(2424)返回返回 p=24 p=24 打印打印 24 24facfac(n)(n)int n;int n;int r;int r;if(n=1)if(n=1)r=1;r=1;else else r=n*r=n*facfac(n-1);(n-1);return(r);return(r);递归递

30、归返回返回过程过程递归递归调用调用过程过程第37页练习:阅读程序写运行结果。书后练习:阅读程序写运行结果。书后P141-7#includemain()inti=5;printf(“%dn”,sub(i);sub(intn)inta;if(n=1)return1;a=n+sub(n-1);return(a);聪明你,动动脑吧!聪明你,动动脑吧!printf(“%dn”,a);输出:输出:15输出:输出:36101515a=5+sub(4);return(a);a=3+sub(2);return(a);a=2+sub(1);return(a);sub(5)if(n=1);return(1);a=4

31、+sub(3);return(a);a=4+sub(3);printf(,a);return(a);a=5+sub(4);printf(,a);return(a);a=3+sub(2);printf(,a);return(a);a=2+sub(1);printf(,a);return(a);sub(5)if(n=1);return(1);361015第38页longfib(intn)/*用递归方法计算用递归方法计算k!*/if(n=1|n=2)return1;returnfib(n-1)+fib(n-2);/*递归调用函数递归调用函数fib()*/main()inti,j=0;for(i=1;

32、i2第39页4.6变量作用域变量作用域(空间空间)1.含义含义:变量作用范围。变量作用范围。2.2.分类分类:“:“局部变量局部变量”和和“全局变量全局变量”。4.6.1局部变量局部变量1.定义定义:在函数体内定义变量。在函数体内定义变量。2.作用域作用域:只在该函数范围内才能被访问到,只在该函数范围内才能被访问到,在此函数以外是不能访问。在此函数以外是不能访问。第40页例例4.13:关于局部变量。关于局部变量。P123ints1(inta)intb,c;floats2(intx,chary)intb,n;main()inti,j;变量变量a,b,c作用域作用域变量变量x,y,b,n作用域作用

33、域变量变量i,j作用域作用域第41页4.6.2全局变量全局变量1.定义:在函数之外定义变量(外部变量)。定义:在函数之外定义变量(外部变量)。2.作用域:作用域:从定义变量位置开始到程序结束之处。从定义变量位置开始到程序结束之处。3.应用:应用:利用利用全局变量全局变量从函数得到一个以上返回值。从函数得到一个以上返回值。4.书写时:不成文要求:第一个字母大写书写时:不成文要求:第一个字母大写5.提议:提议:(少使用少使用)(1)浪费内存;浪费内存;(2)函数通用性降低;函数通用性降低;(3)难判断每个瞬时各个外部变量值。难判断每个瞬时各个外部变量值。第42页例例4.14全局变量作用域范围。书全

34、局变量作用域范围。书P124floatu=1.5,v=3.2;chars1(inta)floatb,c;intp,q;floats2(charx,inty)intm,n;main()ints,r;全局变量全局变量p、q作用域作用域全局变量全局变量u、v作用域作用域第43页inta=3,b=5;main()voidswap();printf(“a=%d,b=%dn”,a,b);swap();printf(“a=%d,b=%dn”,a,b);inttemp;voidswap()temp=a;a=b;b=temp;ab作作用用域域temp作用域作用域例:全局变量例:全局变量输出输出3,55,3第44

35、页inta=3,b=5;intmax(inta,intb)intc;c=ab?a:b;return(c);main()inta=8;printf(max=%d,max(a,b);说明:局部变量与全局变量说明:局部变量与全局变量同名同名时,在时,在局部变量局部变量作用作用范围内范围内,全局变量不起作用全局变量不起作用。输出输出:max=8a、b作用域作用域a作用域作用域a、b作用域作用域第45页例例4.16怎样处理全局变量与局部变量同名怎样处理全局变量与局部变量同名(P125)inty;f1()y=5;printf(“y=%dn”,y);main()inty;y=3;f1();printf(“y

36、=%dn”,y);运行结果:运行结果:y=5y=3第46页intx1=30,x2=40;main()intx3=10,x4=20;sub(x3,x4);sub(x2,x1);printf(“%d,%d,%d,%dn”,x3,x4,x1,x2);sub(intx,inty)x1=x;x=y;y=x1;练习:关于全局变量和局部变量。练习:关于全局变量和局部变量。输出:输出:10,20,40,40值传递,值传递,x3,x4值不变值不变x1是全局变量,发生改变是全局变量,发生改变P140-(4)第47页4.6.3分程序分程序C语言不允许在函数内部定义函数,即函数定义不能嵌套。语言不允许在函数内部定义函

37、数,即函数定义不能嵌套。函数定义中不能出现下面形式:函数定义中不能出现下面形式:f()f1()f2()第48页为填补这一不足,为填补这一不足,C语言允许使用分程序。语言允许使用分程序。即用一对花括号即用一对花括号括起来含有变量申明语句和执行语句括起来含有变量申明语句和执行语句“复合语句复合语句”。其形式以下:其形式以下:变量申明语句变量申明语句执行语句序列执行语句序列第49页例例4.17该例说明分程序作用:该例说明分程序作用:#includemain()intx,y,z;x=1;y=+x;z=+y;intx=7,y=9;printf(“x=%d,y=%d,z=%dn”,x,y,z);z+;pr

38、intf(“x=%d,y=%d,z=%dn”,x,y,z);运行结果:运行结果:x=7,y=9,z=3x=2,y=3,z=4+x先加后用先加后用y=2+y先加后用先加后用z=3x=7,y=9,z=3z=4x=2,y=3,z=4第50页4.7变量生存期变量生存期(时间时间)1.存放方式:存放方式:静态存放:程序运行期间分配静态存放:程序运行期间分配固定固定存放空间存放空间动态存放:程序运行期间依据需要动态存放:程序运行期间依据需要动态动态分配存放空间分配存放空间2.存放区域分类:存放区域分类:静态存放区静态存放区和和动态存放区动态存放区。(1)静态静态存放区中变量存放区中变量:在在程序运行早期程

39、序运行早期就被就被创建创建,寿命往往是与程序同时;,寿命往往是与程序同时;(2)动态动态存放区中变量存放区中变量:暂时性暂时性,在程序运行期间,在程序运行期间随时会被撤消随时会被撤消。3.二者关系见下列图所表示:二者关系见下列图所表示:程序代码区静态存放区动态存放区全局变量、局部静态变量形参变量局部动态变量函数调用现场保护和返回地址等第51页4.7.1自动变量(自动变量(auto)1.含义含义:从包含该变量定义函数开始执行至该函数执行结束。从包含该变量定义函数开始执行至该函数执行结束。2.申明格式:申明格式:auto类型名类型名变量表;变量表;例例4.18书书P127#includevoids

40、ub()autointy=3;/*显式申明显式申明y为自动变量为自动变量*/printf(“y=%dn”,y);main()inty=2;/*隐式申明隐式申明y为自动变量为自动变量*/sub();printf(“y=%dn”,y);运行结果:运行结果:y=3y=2第52页例:例:main()intx=1;voidprt();intx=3;prt();printf(“2ndx=%dn”,x);printf(“1stx=%dn”,x);voidprt()intx=5;printf(“3thx=%dn”,x);输出:输出:3thx=52ndx=31stx=1x=1x=1x=3x=5第53页4.7.2

41、静态变量(静态变量(static)1.含义:含义:从程序开始执行到程序结束,与程序同时。从程序开始执行到程序结束,与程序同时。2.“静态局部变量静态局部变量”与与“自动局部变量自动局部变量”区分:区分:相同点:作用域都是在函数内。相同点:作用域都是在函数内。不一样点:寿命不一样。不一样点:寿命不一样。自自 动动 局局 部部 变变 量量:函函 数数 执执 行行 时时 才才 存存 在在,执执 行行 完完 自自 动动 撤撤 消消,是动态。是动态。静静 态态 局局 部部 变变 量量:在在 函函 数数 执执 行行 之之 前前 就就 存存 在在,寿寿 命命 是是 全全 局局,即与程序同时。即与程序同时。3

42、.申明静态变量格式为:申明静态变量格式为:static类型名类型名变量表;变量表;4.应用:应用:需要保留函数上一次调用结束时值需要保留函数上一次调用结束时值。第54页例例4.19书书P128#includesub()staticinti=1;/*申明静态变量申明静态变量i,并置初值为并置初值为1*/i=2*i;/*静态变量初值默认为静态变量初值默认为0*/return(i);main()inti;for(i=1;i=4;i+)printf(“nresult=%d”,sub();1ii=12i=24i=38i=416result=2result=4result=8result=16输出:输出:

43、第55页对比动态局部变量:对比动态局部变量:#includesub()inti=1;i=2*i;return(i);main()inti;for(i=1;i=4;i+)printf(“nresult=%d”,sub();1ii=12i=2i=3i=4result=2result=2result=2result=2输出:输出:1 2 1 2 1 2第56页main()voidincrement();increment();increment();increment();voidincrement()intx=0;x+;printf(“%dn”,x);练习:练习:输出输出:111main()voi

44、dincrement();increment();increment();increment();voidincrement()staticintx=0;x+;printf(“%dn”,x);输出输出:123第57页4.7.3外部变量(外部变量(extern)1.extern作用:作用:扩展全局变量作用域扩展全局变量作用域,使以前不能访问它,使以前不能访问它函数也能访问到它,也称为作用域函数也能访问到它,也称为作用域“提升提升”。2.申明格式:申明格式:extern类型名类型名变量表;变量表;例例4.20书书P129intmin(inta,intb)return(ab?a:b);main()e

45、xternX,Y;printf(“nmin=%d”,min(X,Y);intX=9,Y=-14;运行结果:运行结果:min=-14第58页例例4.21怎样将全局变量作用域扩展到其它文件中怎样将全局变量作用域扩展到其它文件中File1.cfile2.cfloatA;externA;main()sub()A=A*A;说明说明:假如程序源文件有多个,在一个源文件中定义了:假如程序源文件有多个,在一个源文件中定义了全局变量全局变量A,其余文件都想访问,其余文件都想访问A,则在这些文件中都,则在这些文件中都加上一个加上一个externA申明即可。申明即可。第59页例例4.22怎样将全局变量作用域仅局限在

46、所定义文件中怎样将全局变量作用域仅局限在所定义文件中File1.cfile2.cstaticfloatA;externA;main()sub()A=A*A;说明说明:file1.c中中A前加关键字前加关键字static,申明为申明为静态全局变量静态全局变量,这就限制了它作用域只局限于这就限制了它作用域只局限于file1.c中。中。即使即使file2.c中加上对中加上对A扩展访问申明,也无法在扩展访问申明,也无法在sub函数函数中访问全局变量中访问全局变量A。思索:思索:静态局部变量静态局部变量和和静态全局变量静态全局变量区分?区分?第60页4.7.4存放器变量(存放器变量(register)1

47、.1.定义:将变量值直接放在定义:将变量值直接放在CPU存放器中存放器中2.2.目标:提升变量存取速度。目标:提升变量存取速度。无需到内存中去访问,存取速度就更加快。无需到内存中去访问,存取速度就更加快。3.3.申明格式:申明格式:register类型名类型名变量表;变量表;4.4.应用:变量使用频繁时。应用:变量使用频繁时。注意:注意:(1)只只有有局局部部变变量量和和形形式式参参数数能能够够定定义义为为存存放放器器变变量量,其它变量(如全局变量)不行;其它变量(如全局变量)不行;(2)C语言中,存放器变量语言中,存放器变量仅限于仅限于int、char和指针型和指针型。(3)存存放放器器数数

48、量量有有限限,不不要要定定义义过过多多,多多出出变变量量自自动动作作为为自动变量处理;自动变量处理;第61页例例4.20书书P128#includefloatfac(intm)registerinti;floatf=1;for(i=1;i=m;i+)f=f*i;return(f);main()inti;for(i=1;i=10;i+)printf(“n%d!=%.0f”,i,fac(i);输出:输出:1!=12!=23!=64!=245!=1206!=7207!=50408!=403209!=36288010!=3628800第62页注:用注:用auto、static、register申明变量

49、时,申明变量时,是是在定义这些变量基础上加上这些关键字,在定义这些变量基础上加上这些关键字,不能不能单独使用单独使用;且对一个变量且对一个变量只能申明为一个只能申明为一个存放类别。存放类别。例:例:inta;statica;staticinta;registerstaticinta;第63页例:例:file1.cinta;main().f2();.f1();.f1()autointb;f2();.f2()staticintc;c作用域作用域b作用域作用域a作用域作用域mainf2f1mainf1f2maina生存期生存期:b生存期生存期:c生存期生存期:第64页4.8内部函数和外部函数内部函数

50、和外部函数函数划分依据:依据函数能否被其它函数调用函数划分依据:依据函数能否被其它函数调用4.8.1内部函数内部函数(静态函数静态函数)1.定义:定义:只能被本文件中其它函数所调用函数只能被本文件中其它函数所调用函数,其它文件中函数不能调用。其它文件中函数不能调用。2.形式:形式:(定义时定义时)static类型标识符类型标识符函数名函数名(形式参数表形式参数表)3.优点:优点:使函数只局限于所在文件使函数只局限于所在文件,若不一样文件中有同名函数,互不干扰。若不一样文件中有同名函数,互不干扰。4.8.2外部函数外部函数1.定义:定义:可为其它文件调用函数可为其它文件调用函数。2.形式形式:(

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

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

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

关于我们      便捷服务       自信AI       AI导航        获赠5币

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

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

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

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服