存儲(chǔ)類別和作用域_第1頁(yè)
存儲(chǔ)類別和作用域_第2頁(yè)
存儲(chǔ)類別和作用域_第3頁(yè)
存儲(chǔ)類別和作用域_第4頁(yè)
存儲(chǔ)類別和作用域_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C+程序設(shè)計(jì)第二講 4.6 存儲(chǔ)類別和作用域版本號(hào):V2009.0814.6 存儲(chǔ)類別和作用域變量的作用域:是指變量在程序中有效的空間范圍,變量的作用域與定義變量的位置有關(guān);變量的生存期:指的是變量生成到變量空間釋放的時(shí)間范圍,變量的生存期與變量的存儲(chǔ)類別相關(guān)。 C+可將作用域分為五種:塊作用域、文件作用域、函數(shù)原型作用域、函數(shù)作用域和類作用域。 21. 塊作用域塊:就是用花括號(hào)括起來(lái)的那部分程序。在塊內(nèi)說(shuō)明的標(biāo)識(shí)符只能在該塊內(nèi)引用,即其作用域在塊內(nèi)。所有函數(shù)體內(nèi)定義的變量都具有塊作用域。在一個(gè)函數(shù)內(nèi)或塊內(nèi)定義的變量被稱為局部變量;對(duì)于塊中嵌套其他塊的情況,如果嵌套塊中有同名局部變量,服從局部

2、優(yōu)先原則,即在內(nèi)層塊中屏蔽外層塊中的同名變量。在函數(shù)原型作用域 和函數(shù)作用域內(nèi)定義的變量 都屬于局部變量; 3【例4.12】局部變量的屏蔽。#include void main()int i=5; couti1=in; /Aint i; i=7;couti2=in; /Bcouti3=in; /Creturn;運(yùn)行結(jié)果是:i1=5i2=7i3=542. 文件作用域在所有函數(shù)外定義的變量稱為全局變量,全局變量的作用域稱為文件的作用域;當(dāng)局部變量與全局變量同名時(shí),局部變量(塊作用域內(nèi)的變量)優(yōu)先。它與塊作用域不同的是:在塊作用域內(nèi)可通過(guò)域運(yùn)算符“:”來(lái)引用與局部變量同名的全局變量。5【例4.13】

3、在塊作用域內(nèi)引用文件作用域中的同名全局變量。#include int i=0;/Avoid main()int i=5;/Bcouti;/Cint i=7;/Dcout i; /Ecout:i;/F程序運(yùn)行后結(jié)果為:5706462 變量的存儲(chǔ)類別操作系統(tǒng)為一個(gè)C+程序的運(yùn)行所分配的內(nèi)存分為4個(gè)區(qū)域,如圖4.2所示。代碼區(qū):存放程序代碼,即程序中各個(gè)函數(shù)的代碼塊靜態(tài)數(shù)據(jù)區(qū):存放程序的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)棧區(qū):存放程序中的局部變量,如函數(shù)中的局部變量等堆區(qū):存放動(dòng)態(tài)分配的數(shù)據(jù)。堆區(qū)(動(dòng)態(tài)數(shù)據(jù))棧區(qū)(函數(shù)局部數(shù)據(jù))main()函數(shù)局部數(shù)據(jù)靜態(tài)數(shù)據(jù)區(qū)(全局變量、靜態(tài)變量)代碼區(qū)(程序代碼)圖4.2 程序

4、在內(nèi)存中的區(qū)域7C+使用四種說(shuō)明符auto(自動(dòng)類型)、register(寄存器類型)、static(靜態(tài)類型)和extern(外部類型)來(lái)確定變量的存儲(chǔ)類型。加上變量的作用域的不同,在C+中變量共有下列5種存儲(chǔ)形式: 局部變量、全局變量、外部變量、靜態(tài)變量、寄存器變量;8 在函數(shù)或塊內(nèi)部說(shuō)明的變量稱為局部變量(如形參變量),由于建立和撤消這些變量是由系統(tǒng)自動(dòng)完成,因此這類變量又稱為自動(dòng)型變量。 注意:a: 局部變量?jī)H由說(shuō)明它的函數(shù)或塊的內(nèi)部語(yǔ)句所訪問(wèn);換言之,局部變量在定義自己的函數(shù)或塊之外是不可見(jiàn)的。b: 局部變量在進(jìn)入函數(shù)時(shí)生成,退出時(shí)消亡。因此局部變量的生存期僅存在于被定義的函數(shù)或塊中

5、。1、 自動(dòng)存儲(chǔ)變量(局部變量,屬于auto型)9#includevoid func1( );void func2( );void func1( ) int x;x = 10;coutxt;void main(void ) int x = 20; func1( ); func2( ); cout x;void func2( ) int x;x = -199;coutxt;10程序說(shuō)明: 整形變量x被說(shuō)明了3次,一次在func1中, 另一次在func2和main中, func1和func2中的x互不相關(guān),也就是說(shuō),局部變量的值不能在兩次調(diào)用之間保持。在C語(yǔ)言中,必須在函數(shù)或語(yǔ)句塊的開頭先于其它任

6、何語(yǔ)句說(shuō)明所有的局部變量。但在C+中,只需在變量使用之前說(shuō)明就可以了。(結(jié)果為: 10 -199 20)11 與局部變量不同,全局變量在任何函數(shù)之外說(shuō)明,包括main函數(shù),并且可被任何一個(gè)函數(shù)使用。全局變量將在整個(gè)程序運(yùn)行期間保持有效,同時(shí)可被函數(shù)內(nèi)的任何表達(dá)式訪問(wèn)。說(shuō)明全局變量的最佳位置在程序的一開始。2、全局變量12#includeint count;void func1( );void func2( );void func1( ) int temp; temp = count; func2( ); cout“count is: ” temp;void main(void) count =

7、 100; func1( ); exit(0);void func2( ) int count; for(count=1;count10;count+) cout.put(。);13 全局變量count既不在main( )中說(shuō)明,也不在func1( )中說(shuō)明,但可以在兩者中被訪問(wèn)。函數(shù)func2中也說(shuō)明了一個(gè)同名的局部變量count,但func2訪問(wèn)count時(shí),僅訪問(wèn)自己說(shuō)明的局部變量count,而不是那個(gè)全局變量count。注意: 全局變量和某一函數(shù)的局部變量同名時(shí),在函數(shù)內(nèi)對(duì)該名的訪問(wèn)權(quán)僅針對(duì)局部變量,對(duì)全局變量無(wú)任何影響。程序執(zhí)行結(jié)果為:。count is 100 / 9個(gè)“?!背绦蚍?/p>

8、析:14使用全局變量應(yīng)注意的幾點(diǎn):不論是否需要,全局變量在整個(gè)程序執(zhí)行期間均占用固定的內(nèi)存空間。在使用局部變量就可以達(dá)到其功能時(shí),應(yīng)避免使用全局變量,這樣可以提高函數(shù)的通用性。大量使用全局變量時(shí),可能導(dǎo)致不期望的副作用。例如,變量值在程序其它地點(diǎn)的偶然改變,將在程序的整個(gè)生存期內(nèi)有效。 15 由于C+語(yǔ)言支持分離編譯,既一個(gè)完整的C+語(yǔ)言程序可以由多個(gè)獨(dú)立的文件組成,每個(gè)文件可以分別單獨(dú)編譯,然后再由鏈接程序完成程序組裝。因此必須將程序需要的所有全局變量通過(guò)某種方法告訴所有的獨(dú)立文件。方法就是在一個(gè)文件中說(shuō)明所有全局變量,在其它文件中用extern再次描述它們。因此外部變量定義是:由exter

9、n說(shuō)明的全局變量稱為外部變量。3、外部變量16文件1int x, y;char ch;Void main (void ).文件2extern int x, y;extern char ch;void func22( ) x = y/10;void func1( )x = 123;void func23( ) y = 10;程序分析:在文件2中,全局變量表是從文件1中復(fù)制過(guò)來(lái)的,并將分類符extern加在說(shuō)明之前。extern告訴編譯程序,如下變量的類型和名字已在別處說(shuō)明過(guò)了。 17穩(wěn)定的具有固定的內(nèi)存地址的變量稱為靜態(tài)變量; ( 或:用static 修飾的變量); 靜態(tài)變量不象動(dòng)態(tài)變量是在程序

10、執(zhí)行過(guò)程中被動(dòng)態(tài)建立、動(dòng)態(tài)撤消的。靜態(tài)變量的定義格式為:static 變量類型 變量列表;靜態(tài)變量又可分為靜態(tài)局部變量和靜態(tài)全局變量。靜態(tài)局部變量:是指定義在模塊內(nèi)部的靜態(tài)變量。它與局部變量的共同點(diǎn)是:都是局限于某個(gè)模塊內(nèi)部;僅在該模塊內(nèi)是有效的;4、靜態(tài)變量18 局部變量?jī)H存在于該模塊被調(diào)用時(shí),函數(shù)退出后,該變量就消失了。因此,它沒(méi)有連續(xù)性,在末賦初值時(shí),其值不定;而靜態(tài)局部變量是始終存在的,即使退出該模塊,變量仍然有效。這是因?yàn)樗趦?nèi)存中占有固定的單元,在多次調(diào)用該模塊時(shí),可以保持此變量的連續(xù)性。它們的不同點(diǎn)是:19#includevoid abc( int x, int y, int z

11、);void main(void ) int i, j, k;i = 5; j = 10;for(k = 1; k=5; k+) abc( i, j, k);void abc(int x, int y, int z)int m; static int n;if( z = 1) m = 0; n = 0; else m += x + y;n += x + y;coutm = m,n = nn;例:說(shuō)明靜態(tài)局部變量與局部變量的區(qū)別;20在上例中,函數(shù)abc( )中的if語(yǔ)句if(z = 0) m = 0; n = 0; 是為了同時(shí)給m , n 賦值。然而多次調(diào)用函數(shù)abc( ),n的初值在起作用,

12、保持了連續(xù)性。而m 初值沒(méi)有起作用,沒(méi)有連續(xù)性。語(yǔ)句 m += x + y; 在z != 1以后的多次調(diào)用中,結(jié)果為不確定(因?yàn)闆](méi)有被賦值)。程序運(yùn)行結(jié)果:m = 0, n = 0;m = *, n = 15m = *, n = 30; m = *, n = 45;m = *, n = 60;其中 * 表示不確定值。程序說(shuō)明:21 用static修飾全局變量稱為靜態(tài)全局變量。靜態(tài)全局變量與全局變量在形式上類似,但意義不同。靜態(tài)全局變量只在它被定義的源文件中是有效的(該文件可以有幾個(gè)函數(shù)),而在任何別的源文件中則是無(wú)效的。而全局變量通過(guò)extern修飾后可以作用于一個(gè)程序的多個(gè)源文件中。 靜態(tài)全

13、局變量:22例:文件1static int i=5; int j=10; void main(void) int k1, k2; k1 = f1(i, j); k2 = f2(i, j);coutk1=k1,k2=k2endl;f1(int x, int y) int z; z = x + y + i; return (z);文件2extern int j;f2(int a, int b) int c; c = a*b+j; return(c);運(yùn)行結(jié)果: k1 = 20, k2 = 60;23程序說(shuō)明: 這個(gè)程序有三個(gè)函數(shù):main, f1, f2。其中函數(shù)f2單獨(dú)作為一個(gè)文件,main和f

14、1為另一個(gè)文件。程序中用一個(gè)靜態(tài)全局變量i和一個(gè)全局變量j。因此變量j既可以在文件1中使用,也可以在文件2中通過(guò)extern說(shuō)明使用。然而,變量i是靜態(tài)全局變量,它只能在文件1中使用,即在函數(shù)main和函數(shù)f1中使用。24C+語(yǔ)言提供了一種僅用于int和char類型變量的存儲(chǔ)分類符register,(因?yàn)橥ǔ<拇嫫魇?6位或32位字長(zhǎng))。它的定義是:用register修飾的局部變量稱為寄存器變量。 幾點(diǎn)注意:分類符register要求編譯系統(tǒng)將它所說(shuō)明的變量值保存在CPU寄存器中,而不是象普通變量那樣存放在內(nèi)存單元中,此時(shí)由于對(duì)變量的存取不必訪問(wèn)內(nèi)存,因此運(yùn)算速度大大快于普通變量的運(yùn)算。這一類

15、變量常用于循環(huán)控制部分;分類符register僅可用于局部變量和函數(shù)的形式參數(shù),因?yàn)檫@些變量都是缺省的自動(dòng)變量。全局的register變量是不允許的;5、寄存器變量25因?yàn)閞egister變量存放在CPU的寄存器中,所以它沒(méi)有地址,也就是說(shuō),不能用地址操作符&對(duì)register變量進(jìn)行地址操作;一個(gè)函數(shù)中所允許的寄存器變量的數(shù)目取決于處理器類型以及所指定的C+編譯系統(tǒng)。若程序中寄存器變量的數(shù)量超過(guò)極限時(shí),編譯系統(tǒng)可能自動(dòng)將它們轉(zhuǎn)換成自動(dòng)變量,從而保證了程序的可移植性;26int_pwr(int m , register int e)register int temp;temp = 1;for(

16、 ; e ; e-)temp = temp * m;return(temp);程序說(shuō)明: 其中e和temp因用在循環(huán)中而又都說(shuō)明為register變量,由于register變量可以提高速度,因此它是最理想的循環(huán)控制變量。例:求M的e次冪。27最后總結(jié):全局變量和靜態(tài)變量只在程序的開始一次生成;局部變量和寄存器變量在進(jìn)入定義它們的程序塊和每個(gè)入口多次生成;沒(méi)有賦值的局部變量和寄存器變量在第一個(gè)賦值語(yǔ)句之前是末知的。例1:不同存儲(chǔ)類變量的應(yīng)用;例2:自動(dòng)類與局部靜態(tài)類變量的應(yīng)用;例3:由多個(gè)文件組成的程序中變量的作用域;28#include#includeint i=1;void other(vo

17、id);void main(void) static int a;register int b=-10;int c=0;couti:a:b:c:endl;coutisetw(8)asetw(8)bsetw(8)cendl;/例:不同存儲(chǔ)類型變量的應(yīng)用c += 8;other( );coutisetw(8)asetw(8)bsetw(8)cendl;i += 10;other( ); void other(void) static int a=2;static int b;int c=10;a += 2;i += 32;c += 5;coutisetw(8)asetw(8)bsetw(8)cendl;b = a;29void other(void)static int a=2;static int b;int c=10;a += 2;i += 32;c += 5;coutisetw(8)asetw(8)bsetw(8)cendl;b = a;30#includeint f1(register);int f2(register);void main(void) int i, re1, re

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論