C语言教程同步课件10讲(第7章)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《C语言程序设计教程》编写组2007年1月第十讲作用范围和存储类别2第十讲作用范围和存储类别作用范围存储类别包含多个源文件的程序C语言程序设计3简介变量定义的完整格式:存储类别数据类型变量名数据类型占据存储空间的大小取值范围存储类别在内存中持续的时间(生存期)在硬件中存放的位置其它属性作用范围–可以被引用的程序部分(可见性)作用范围和存储类别4标识符的作用域标识符的作用域是指一个标识符,包括变量名、函数名等,在程序中可以被使用的范围。(在这个范围内引用该标识符是合法的,而在这个范围之外,该标识符是不能被引用的)在C语言中可以在函数内部、函数外部以及函数的参数中定义变量,定义的位置不同,变量的作用域也不同。变量的作用域也称为可见性,变量的声明方式不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。作用范围和存储类别5局部变量在一个函数内部定义的变量被称作局部变量(形式参数也是局部变量),这种变量的作用域是在本函数范围内,即从变量定义的位置开始,到函数体结束。通俗一点说,局部变量只能在定义它的函数内部使用,而不能在其它函数内使用这个变量。作用范围和存储类别6局部变量说明:1、main函数也是一个函数,它内部定义的变量也只能在main函数内部使用,不能在其它函数中使用。同样,主函数中也不能使用其他函数中定义的变量。2、不同的函数中可以使用同名的变量,这些局部变量代表不同的对象,分配不同的存储单元,不会互相干影响。3、形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。4、在复合语句内部也可以定义变量,这些变量的作用域只在本复合语句中。作用范围和存储类别例intfun_a(inta){intb,c;......}intfun_b(intx){inty,z;}main(){intm,n;}a,b,c作用域在fun_a内同样,x,y,z作用域在fun_b内m,n作用域在main内main(){ints,a;......{intb;s=a+b;......}......}b的作用域在复合语句内s,a的作用域在main内8例作用范围和存储类别10-1.c#includestdio.hfun(){intn=6;printf(ninfun:%d\n,n);}voidmain(){intn=3;fun();printf(ninmain:%d\n,n);}10-2.c#includestdio.hvoidmain(){inti=2,j=3,k;k=i+j;{intk=8;if(i=3)printf(%d\n,k);}printf(%d\n%d\n,i,k);}9全局变量在函数外定义的变量称为全局变量,也称为外部变量。全局变量的作用域是从定义变量的位置开始到本源文件结束。这样全局变量可以让很多函数都使用它。全局变量一经定义,编译系统会为其分配固定的内存单元,在程序运行时始终都占用固定内存单元。作用范围和存储类别10全局变量说明:1、对于局部变量的定义和说明,可以不加区分。而对于全局变量则不然,全局变量的定义和全局变量的说明并不是一回事。全局变量定义必须在所有的函数之外,且只能定义一次。当需要在全局变量定义位置之前引用它,应该使用extern对该变量进行声明,即可在同一文件内部扩展全局变量的作用域。全局变量声明的格式为:extern类型说明符变量名;2、全局变量的初始化只能有一次,是在对全局变量进行定义的时候。3、全局变量的作用是使得函数间多了一种传递信息的方式。如果在一个程序中各个函数都要对同一个信息进行处理,就可以将这个信息定义成全局变量。另外,采用这种方式,可以从某个函数内部得到多个计算值。(注,使用全局变量会使函数的独立性降低,因此在不必要时尽量不要使用全局变量)4、在同一个源文件中,如果局部变量和全局变量重名,则在局部变量的作用域内,全局变量不起作用。作用范围和存储类别例inta,b;voidfun1(){......}floatx,y;intfun2(){......}main(){......}全局变量a,b作用域全局变量x,y作用域10-3.c#includestdio.hintX=1;printx();voidmain(){printf(Xinmain:%d\n,X);printx();printf(Xinmain:%d\n,X);}printx(){intX=2;printf(Xinprintx:%d\n,X);}变量的存储类别求1-5的阶乘,并将它们依次输出。10-4.c#includestdio.hvoidfac(intn){staticintf=1;f=f*n;printf(%d!=%d\n,n,f);}voidmain(){inti;for(i=1;i=5;i++)fac(i);}为使函数中的局部变量f在函数调用结束后仍能保留,在下一次调用时继续使用,实现方法是将变量f的存储类别定义为静态的。变量的存储类别由于程序在执行过程中,程序和数据在内存中存放的区域是有一定规定的。供用户使用的存储空间大致分为三个不同的部分:1)程序区:存放程序的可执行代码模块。2)静态存储区:存放所有的全局变量以及标明为静态类的局部变量部分.3)运行栈区:存放的数据又分为以下几种。函数调用时,按序动态存放主调函数执行过程中的现场。此类数据存放也称为现场保护。所有未标明为静态类的局部变量。函数的形式参数。存放在运行栈区的数据均采用动态存储分配方法。变量的存储方式分为:静态存储在变量定义时就分配存储单元并一直保持不变,直至整个程序结束。动态存储是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。15变量的存储类别四种存储类别说明符autoregisterexternstatic两种存储时期动态存储时期autoregister静态存储时期externstatic作用范围和存储类别16动态存储类别自动存储程序执行到变量所在的程序块内时创建它,退出时销毁。不会被自动初始化。auto(自动变量):局部变量的缺省类别。程序块中声明的变量,函数的参数。register(寄存器变量):建议编译器把变量放进高速的寄存器。只适用于自动变量。作用范围和存储类别autointa,b;registerintcount=1;等价于inta,b;17静态存储类别静态存储程序开始执行时创建,在程序执行期间,变量一直存在。自动被初始化,缺省初值:0或‘\0’。static(静态变量):可以用于在程序块中定义的变量。退出程序块后依然存在,并保留值。但不改变其作用范围,即只能在所在的程序块内被使用。由于所有全局变量都是静态类型的,C语言规定,static通常在全局变量的定义中可以省去不写。静态变量有两种:静态全局变量和静态局部变量。作用范围和存储类别staticinta,b;静态存储类别extern(外部变量):用来声明在“外部”定义的全局变量。仅用于声明变量。只有定义为extern类型的外部变量才能供其他文件使用。外部变量的定义是在所有函数体之外,用extern或默认存储类别说明,定义时可以给它赋初值,而且只能赋初值一次。外部变量和全局变量是对同一类变量的两种不同角度的提法。全局变量是从它的作用域提出的,外部变量是从它的存储方式提出的,表示了它的生存期。externinttotal;19案例分析:存储类别存储类别读下面的程序,写出结果。(10-5.c)作用范围和存储类别voidtry(inta){autointb=10;staticintc=10;b++;c++;printf(a=%d\tb=%d\tc=%d\n,a,b,c);}voidmain(){inti;for(i=1;i=3;i++)try(i);}a=1b=11c=11a=2b=11c=12a=3b=11c=1320案例分析:存储类别存储类别结果分析作用范围和存储类别cababab123动态存储区静态存储区FF00220822062206220422042202a=1b=11c=11a=2b=11c=12a=3b=11c=1321案例分析:外部变量外部变量(10-6.c)作用范围和存储类别#includestdio.hvoidmain(){externinta;intc=3;printf(a=%d\n,a);{externintc;c=4;printf(innerc=%d\n,c);}printf(c=%d\n,c);}inta=1;intc=5;a=1innerc=4c=322案例分析:作用范围与存储类别作用范围与存储类别(cw0903.c)作用范围和存储类别#includestdio.hvoida(void);voidb(void);voidc(void);intx=1;voidmain(){intx=5;printf(localxinouterscopeofmainis%d\n,x);{intx=7;printf(localxininnerscopeofmainis%d\n,x);}printf(\nlocalxinouterscopeofmainis%d\n,x);23案例分析:作用范围与存储类别作用范围与存储类别作用范围和存储类别a();b();c();a();b();c();printf(localxinmainis%d\n,x);}voida(){intx=25;/*initializedeachtimeaiscalled*/printf(\nlocalxinais%dafterentering\n,x);x++;printf(localxinais%dbeforeexiting\n,x);}24案例分析:作用范围与存储类别作用范围与存储类别作用范围和存储类别voidb(){staticintx=50;printf(\nlocalxinbis%dafterentering\n,x);x++;printf(localxinbis%dbeforeexiting\n,x);}voidc(){printf(\nglobalxis%donenteringc\n,x);x*=10;printf(globalxis%donexitingc\n,x);}25案例分析:作用范围与存储类别作用范围与存储类别作用范围和存储类别localxinouterscopeofmainis5localxininnerscopeofmainis7localxinouterscopeofmainis5localxinais25afterenteringalocalxinais26beforeexitingalocalxinbis50afterenteringblocalxinbis51beforeexitingbglobalxis1onenteringcglobalxis10onexitingc26案例分析:作用范围与存储类别作用范围与存储类别作用范围和存储类别localxinais25afterenteringalocalxinais26beforeexitingalocalxinbis51afterenteringblocalxinbis52beforeexitingbglobalxis10onenteringcglobalxis100onexitingclocalxinmainis527包含多个源文件的程序包含多个源文件的程序每个函数的定义必须在一个文件内,不能被分割。全局变量可以被同一文件内的函数访问。如果需要被其他文件内的函数访问,则必须在其他文件内声明。extern表示变量myGlobal是在另一个文件内定义的。一个文件内定义的函数,也可以被其他文件内的函数调用。在每个文件内加入该函数的原型(声明为外部函数)。函数的原型可以不需要extern。作用范围和存储类别intmyGlobal;externintmyGlobal;a.cb.c28包含多个源文件的程序包含多个源文件的程序举

1 / 32
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功