您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 第12章--C语言中用户标识符的作用域和存
第12章用户标识符的作用域和存储类12.1局部变量、全局变量和存储分类12.2局部变量及其作用域和生存期12.3全局变量及其作用域和生存期12.4函数的存储分类变量的作用域:局部变量:在函数内部或复合语句内部定义的变量。全局变量:在函数外部定义的变量。变量的生存期:动态类:在函数内部或复合语句内部定义的变量。静态类:在函数外部定义的变量。定义变量:[存储类别]数据类型变量名;根据变量的存储类别就可以知道变量的作用域和生存期。12.1局部变量、全局变量和存储分类变量的作用域与其定义语句在程序中出现的部位有直接的关系。在函数内部或复合语句定义的变量,称为局部变量。局部变量只在本函数内或复合语句中有效。不同函数中可以使用相同名字的变量。在函数外部定义的变量,称为全局变量。例1:#include“stdio.h”floatf1(inta){intb,c;……}charf2(intx,inty){inti,j;……}voidmain(){inta,b,c;……}例2:#include“stdio.h”voidmain(){intx=10;{intx=20;printf(“%d,”,x);}printf(“%d\n,x);}12.2局部变量及其作用域和生存期情况1:auto变量(动态的局部变量)系统默认的变量属性就是auto类型,所以通常情况下很少使用关键字auto。auto变量在进入声明该变量的函数时建立,退出该函数时撤销。未赋初值的auto变量其值不确定,称为“无定义”。优点:可在各函数之间造成信息隔离,不同函数中使用了同名变量也不会相互影响,从而可避免因不慎赋值所导致的错误影响到其他函数。例1:intfun(inta){intb,c=3;……}例2:intfun(inta){autointb,c=3;……}等价情况2:register变量(动态的局部变量)用register说明的变量建议编译程序将变量的值保留在CPU的寄存器中。访问存于寄存器内的值要比访问于内存中的值要快得多。CPU中寄存器的数目是有限的,不能定义任意多个register变量。当没有足够的寄存器来存放指定的变量,或编译程序认为指定的变量不适合放在寄存器中时,将自动按auto变量来处理。#include“stdio.h”intpower(int,registerint);voidmain(){ints;s=power(5,3);printf(“%d\n”,s);}intpower(intx,registerintn){registerintp;for(p=1;n;n--)p=p*x;returnp;}例1:情况3:静态的局部变量即用关键字static声明的局部变量。在整个程序运行期间,静态局部变量占据着永久性的存储单元。下次调用该函数时,该变量拥有最近一次退出该函数时所拥有的值。静态变量的初始化只执行一次。对于未赋初值的静态局部变量,C编译程序自动给它赋初值0。虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。例:#include“stdio.h”voidmain(){inti,j=2;for(i=0;i3;i++)printf(“%4d”,function(i));}intfunction(inta){intb=0;b++;c++;return(a+b+c);}staticintc=3;输出结果:789staticintc;输出结果:45612.3全局变量及其作用域和生存期全局变量只有静态一种类别。全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束为止。如果全局变量与局部变量同名,会出现全局变量被“屏蔽”的现象。一般不提倡使用全局变量。对于全局变量可使用extern和static两种说明符。例:voidfun1(void);voidfun2(void);intsum;/*全局变量*/voidmain(){……sum++;……}voidfun1(void){……sum++;……}inttest;/*全局变量*/voidfun2(void){……sum++;test=1;……}#include“stdio.h”intsum;voidfun(void);voidmain(){sum=10;printf(“**main(1)**:%d\n”,sum);fun();printf(“**main(2)**:%d\n”,sum);}voidfun(void){intsum;sum=20;printf(“**fun**:%d\n”,sum);}例2:例:#include“stdio.h”intd=1;intfun(intp){intd=5;d+=p++;printf(“%d”,d);}voidmain(){inta=3;fun(a);d+=a++;printf(“%d\n,d);}输出结果:84#includestdio.h#includestring.hstructperson{charname[10];intcount;}leader[3]={“Zhang,0,“Li,0,Wang,0};voidtongji(chars[]){inti;for(i=0;i3;i++)if(strcmp(s,leader[i].name)==0)leader[i].count++;}例:对3个候选人投票,统计出每个人的得票数。方法1:利用结构体数组voidmain(){inti;chars[10];printf(Pleaseinput10choices:\n);for(i=1;i=10;i++){gets(s);tongji(s);}for(i=0;i3;i++)printf(%s:%d\n,leader[i].name,leader[i].count);}#includestdio.h#includestring.hchars1[5]=“Zhang,s2[5]=“Li,s3[5]=“Wang;intx=0,y=0,z=0;voidmain(){chars[5];inti;voidtongji(chars[5]);for(i=1;i=5;i++){gets(s);tongji(s);}printf(Zhang:%d,Li:%d,Wang:%d\n,x,y,z);}voidtongji(chars[5]){if(strcmp(s,s1)==0)x++;if(strcmp(s,s2)==0)y++;if(strcmp(s,s3)==0)z++;}方法2:利用全局变量情况1:在一个文件内声明外部变量即用关键字extern声明的外部变量。如果外部变量的定义处并不在文件开头,那么在定义位置前是不能使用该变量的,在这种情况下如果需要使用这个外部变量,必须在使用前用extern对该变量进行重新声明才能使用。用extern定义变量,实质上是对“外部变量的声明”而不是定义变量,并不建立该变量的存储空间。一般做法是外部变量的定义放在引用它的所有函数之前,这样可以避免在函数中多加一个extern声明。例1:#include“stdio.h”voidmain(){intmax(int,int);extereninta,b;/*外部变量声明*/printf(“%d\n”,max(a,b));}inta=13,b=-8;/*定义外部变量*/intmax(intx,inty){intz;z=xyx:y;returnz;}输出结果:13例2:#include“stdio.h”voidnum(void){exterenintx,y;inta=15,b=10;x=a-b;y=a+b;}intx,y;voidmain(){inta=7,b=5;x=a-b;y=a+b;printf(“%d,%d\n”,x,y);num();printf(“%d,%d\n”,x,y);}输出结果:2,125,25情况2:在多个文件中声明外部变量即用关键字extern声明的外部变量。解决了多个文件都要用同一个外部变量的问题。在其中一个文件中定义所有的全局变量,而在其他用到这些全局变量的文件中用extern对这些变量进行说明。一般做法是外部变量的定义放在引用它的所有函数之前,这样可以避免在函数中多加一个extern声明。/*file1.c文件*/#include“file2.c”intx,y;voidfun1(void);voidfun2(void);voidfun3(void);voidmain(){fun1();fun2();fun3();}voidfun1(void){x=111;printf(“(1)x=%d\n”,x);}例3:/*file2.c文件*/#include“stdio.h”externintx;voidfun2(void){printf(“(2)x=%d\n”,x);}voidfun3(void){x++;printf(“(3)x=%d\n”,x);}file1.c等价于:#include“stdio.h”externintx;voidfun2(void){printf(“(2)x=%d\n”,x);}voidfun3(void){x++;printf(“(3)x=%d\n”,x);}intx,y;voidfun1(void);voidfun2(void);voidfun3(void);voidmain(){……}voidfun1(void){……}/*file1.c文件*/#include“file2.c”inty;voidfun1(void);voidfun2(void);voidfun3(void);voidmain(){fun1();fun2();fun3();}voidfun1(void){x=111;printf(“(1)x=%d\n”,x);}例3改进:/*file2.c文件*/#include“stdio.h”intx;voidfun2(void){printf(“(2)x=%d\n”,x);}voidfun3(void){x++;printf(“(3)x=%d\n”,x);}情况3:静态全局变量/*file1.c文件*/#include“file2.c”staticintn;voidfunc(void);voidmain(){n=5;printf(“file1:%d\n”,n);func();}/*file2.c文件*/#include“stdio.h”externintn;voidfunc(void){printf(“file2:%d\n”,n);}即用关键字static声明的全局变量。静态全局变量只限于本编译单位使用,不能被其他编译单位所引用。由此可见static说明限制了全局变量作用域的扩展,达到了信息隐蔽的目的。全局变量和静态全局变量的区别:若程序由一个源文件构成时,两者没有区别。若程序由多个源文件构成时,两者有区别:全局静态变量被定义该变量的源文件所独享。局部全局动态类auto、register无静态类staticextern、static本章总结:
本文标题:第12章--C语言中用户标识符的作用域和存
链接地址:https://www.777doc.com/doc-2242555 .html