第十二章c语言中用户标志符的作用域和存储类几个重要概念:1.标志符的作用域:一个定义了的标志符可以使用的范围,即有效的作用范围.2.标志符的生存期:变量或函数等在程序运行期间存在并保存其值的时刻.3.定义(definition):指给变量分配确定的存储单元.4.说明(declaration):只是说明变量的性质,而不分配存储空间.•变量的存储属性–概述•变量是对程序中数据的存储空间的抽象内存…….main(){inta;a=10;printf(“%d”,a);}1020002001程序中使用变量名对内存操作•变量的属性–数据类型:变量所持有的数据的性质(操作属性)–存储属性»存储器类型:寄存器、静态存储区、动态存储区»生存期:变量在某一时刻存在-------静态变量与动态变量»作用域:变量在某区域内有效-------局部变量与全局变量•变量的存储类型–auto-----自动型–register-----寄存器型–static------静态型–extern-----外部型•变量定义格式:[存储类型]数据类型变量表;•变量的存储属性–概述•变量是对程序中数据的存储空间的抽象如:intsum;autointa,b,c;registerinti;staticfloatx,y;–局部变量与全局变量•局部变量---内部变量–定义:在函数内定义,只在本函数内有效–说明:»main中定义的变量只在main中有效»不同函数中同名变量,占不同内存单元»形参属于局部变量»可定义在复合语句中有效的变量»局部变量可用存储类型:autoregisterstatic(默认为auto)floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效例不同函数中同名变量main(){inta,b;a=3;b=4;printf(main:a=%d,b=%d\n,a,b);sub();printf(main:a=%d,b=%d\n,a,b);}sub(){inta,b;a=6;b=7;printf(sub:a=%d,b=%d\n,a,b);}例复合语句中变量#defineN5main(){inti;inta[N]={1,2,3,4,5};for(i=0;iN/2;i++){inttemp;temp=a[i];a[i]=a[N-i-1];a[N-i-1]=temp;}for(i=0;iN;i++)printf(%d,a[i]);}运行结果:54321运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4•全局变量---外部变量–定义:在函数外定义,可为本文件所有函数共用–有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件应尽量少使用全局变量,因为:全局变量在程序全部执行过程中占用存储单元降低了函数的通用性、可靠性,可移植性降低程序清晰性,容易出错定义说明次数:只能1次可说明多次位置:所有函数之外函数内或函数外分配内存:分配内存,可初始化不分配内存,不可初始化–外部变量说明:extern数据类型变量表;–外部变量定义与外部变量说明不同–若外部变量与局部变量同名,则外部变量被屏蔽–外部变量可用存储类型:缺省或staticfloatmax,min;floataverage(floatarray[],intn){inti;floatsum=array[0];max=min=array[0];for(i=1;in;i++){if(array[i]max)max=array[i];elseif(array[i]min)min=array[i];sum+=array[i];}return(sum/n);}main(){inti;floatave,score[10];/*Input*/ave=average(score,10);printf(max=%6.2f\nmin=%6.2f\naverage=%6.2f\n,max,min,ave);}作用域maxminintp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的作用范围p,q的作用范围externcharc1,c2;externcharc1,c2;c1,c2的作用范围扩展后c1,c2的作用范围扩展后例外部变量定义与说明intmax(intx,inty){intz;z=xy?x:y;return(z);}main(){externinta,b;printf(max=%d,max(a,b));}inta=13,b=-8;运行结果:max=13externinta,b;intmax(){intz;z=ab?a:b;return(z);}main(){printf(max=%d,max());}inta=13,b=-8;运行结果:max=13inta=3,b=5;max(inta,intb){intc;c=ab?a:b;return(c);}main(){inta=8;printf(max=%d,max(a,b));}例外部变量与局部变量运行结果:max=8inti;main(){voidprt();for(i=0;i5;i++)prt();}voidprt(){for(i=0;i5;i++)printf(“%c”,’*’);printf(“\n”);}例外部变量副作用运行结果:*****–动态变量与静态变量•存储方式–静态存储:程序运行期间分配固定存储空间–动态存储:程序运行期间根据需要动态分配存储空间•内存用户区程序区静态存储区动态存储区全局变量、局部静态变量形参变量局部动态变量(autoregister)函数调用现场保护和返回地址等•生存期–静态变量:从程序开始执行到程序结束–动态变量:从包含该变量定义的函数开始执行至函数执行结束–变量存储类型静态动态存储方式程序整个运行期间函数调用开始至结束生存期编译时赋初值,只赋一次每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存储区动态区存储区寄存器局部变量外部变量作用域定义变量的函数或复合语句内本文件其它文件局部变量默认为auto型register型变量个数受限,且不能为long,double,float型局部static变量具有全局寿命和局部可见性局部static变量具有可继承性extern不是变量定义,可扩展外部变量作用域register局部staticauto外部static外部存储类别例文件file1.cinta;main(){…….…….f2;…….f1;…….}f1(){autointb;………f2;……..}f2(){staticintc;………}C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:例auto变量的作用域main(){intx=1;voidprt(void);{intx=3;prt();printf(“2ndx=%d\n”,x);}printf(“1stx=%d\n”,x);}voidprt(void){intx=5;printf(“3thx=%d\n”,x);}运行结果:3thx=52ndx=31stx=1x=1作用域x=1作用域x=3作用域x=5作用域main(){voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;x++;printf(“%d\n”,x);}例局部静态变量值具有可继承性运行结果:111main(){voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;x++;printf(“%d\n”,x);}运行结果:123例变量的寿命与可见性#includestdio.hinti=1;main(){staticinta;registerintb=-10;intc=0;printf(-----MAIN------\n);printf(i:%da:%d\b:%dc:%d\n,i,a,b,c);c=c+8;other();printf(-----MAIN------\n);printf(i:%da:%d\b:%dc:%d\n,i,a,b,c);i=i+10;other();}other(){staticinta=2;staticintb;intc=10;a=a+2;i=i+32;c=c+5;printf(-----OTHER------\n);printf(i:%da:%d\b:%dc:%d\n,i,a,b,c);b=a;}-------Main------i:1a:0b:-10c:0------Other------i:33a:4b:0c:15-------Main-----i:33a:0b:-10c:8-------Other-------i:75a:6b:4c:15全局i1main:a0b:-10registermain:c0静态存储区动态存储区other:a2other:b0other:c10843315443other:c10675156main(){voidgx(),gy();externintx,y;printf(“1:x=%d\ty=%d\n”,x,y);y=246;gx();gy();}voidgx(){externintx,y;x=135;printf(“2:x=%d\ty=%d\n”,x,y);}intx,y;voidgy(){printf(“3:x=%d\ty=%d\n”,x,y);}例用extern扩展外部变量作用域运行结果:1:x=0y=02:x=135y=2463:x=135y=246例引用其它文件中的外部变量intglobal;externfloatx;main(){intlocal;...}externintglobal;staticintnumber;func2(){...}floatx;staticintnumber;func3(){externintglobal;...}file1.cfile2.cfile3.c例引用其它文件中的变量,输出ab和a的m次方inta;main(){intpower(intn);intb=3,c,d,m;printf(Enterthenumberaanditspower:\n);scanf(%d,%d,&a,&m);c=a*b;printf(%d*%d=%d\n,a,b,c);d=power(m);printf(%d**%d=%d,a,m,d);}externinta;intpower(intn){inti,y=1;for(i=1;i=n;i++)y*=a;return(y);}