資源描述:
《存儲類型與類型界限符.ppt》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、第12章存儲類型與類型限定符學(xué)習(xí)目標(biāo)(1)理解存儲類型的基本概念及類別。(2)掌握extern、register、static和const等類型限定符的使用方法。在C語言中,每一個變量和函數(shù)都有兩個屬性:類型(type)和存儲類型(storageclass),其中類型決定了為變量和函數(shù)分配多大的存儲單元,而存儲類型確定了所聲明對象的生存期。生存期也稱為存儲期間,它是指對象保持所分配的存儲單元的時間。存儲類型有4種,分別是自動、外部、寄存器和靜態(tài),對應(yīng)的關(guān)鍵字分別是:autoexternregisterstatic前面所涉及到變量,聲明時都沒
2、有明顯地指明存儲類型,這種缺省的存儲類型是自動的。如下列明顯地指定存儲類型的聲明autointa,b;autofloatx,y;{inta=12,b=23;floatx=5.6,y=16.4;……}進入塊時,為變量a、b、x和y分配存儲單元a12b23x5.6y16.4退出塊時,釋放分配給變量a、b、x和y的存儲單元abxy等價于下列缺省存儲類型的聲明inta,b;floatx,y;12.2存儲類型extern這種變量只要在函數(shù)和塊之外聲明后,它能在函數(shù)或塊的內(nèi)外都保持分配給它的存儲單元,從而保持其值。#includefl
3、oatpi=3.14159;inta=1,b=2,c=3;intf(void);intmain(void){printf("%3d",f());printf("%3d%3d%3d",a,b,c);return0;}intf(void){intb,c;a=b=c=4;return(a+b+c);}外部變量定義時不需要使用extern在定義聲明外部變量時,無需使用存儲類型符extern,且一般包括有初始化。但是并不是意味著任何時候都可以省略存儲類型符extern。在定義這種外部變量的文件之外的其他文件中使用它時,需要用存儲類型符exte
4、rn聲明。外部變量也稱為是全局變量。作用域是從定義的地方開始到程序結(jié)束。注意:floatarea_circle(floatr,float*S){externfloatpi;if(r>0){*S=r*r*pi;return1;}elsereturn0;}例,在另一個文件中函數(shù)area_circle()需要訪問前述文件中定義的外部變量pi,則訪問前需要用存儲類型符extern聲明pi。所有的函數(shù)的存儲類型都具有外部存儲類型,在函數(shù)體中和函數(shù)原型中都可以使用關(guān)鍵字extern。例如,externfloatarea_circle(float,flo
5、at*);……externfloatarea_circle(floatr,float*S){externfloatpi;if(r>0){*S=r*r*pi;return1;}elsereturn0;}12.3存儲類型register變量與存儲單元關(guān)聯(lián),一個變量具有一個特定大小的存儲單元,給變量賦值就是將該值存儲到相應(yīng)的存儲單元中,給變量分配存儲單元是由編譯程序來完成的,分配給變量的存儲單元一般是來自內(nèi)存。但是,我們可以通過將int變量聲明為存儲類型register,而把寄存器(CPU中的存儲單元)分配給它,這樣有關(guān)該變量的運算速度將得到提高
6、。例:{registerinti;for(i=0;i7、進入塊內(nèi)時使用它。1.變量聲明為存儲類型static#includevoidf(void);intmain(void){f();f();f();return0;}voidf(void){intcnt=0;++cnt;printf("cnt=%d",cnt);}運行結(jié)果:cnt=0cnt=0cnt=0修改為:staticintcnt=0;運行結(jié)果:cnt=1cnt=2cnt=3這種情形,不管程序如何執(zhí)行,變量也保持它的原有值,但是,不允許其他文件對它進行訪問,即一個文件中static類型的外部變量不能被其他文件“操作”,
8、即它對外而言是不可見的,這種變量也稱為私有變量。(2)聲明外部變量為static的情形。程序文件file1.c:程序文件file2.c:#includeexte