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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

5、。1、 自動存儲變量(局部變量,屬于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程序說明: 整形變量x被說明了3次,一次在func1中, 另一次在func2和main中, func1和func2中的x互不相關,也就是說,局部變量的值不能在兩次調用之間保持。在C語言中,必須在函數(shù)或語句塊的開頭先于其它任

6、何語句說明所有的局部變量。但在C+中,只需在變量使用之前說明就可以了。(結果為: 10 -199 20)11 與局部變量不同,全局變量在任何函數(shù)之外說明,包括main函數(shù),并且可被任何一個函數(shù)使用。全局變量將在整個程序運行期間保持有效,同時可被函數(shù)內的任何表達式訪問。說明全局變量的最佳位置在程序的一開始。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( )中說明,也不在func1( )中說明,但可以在兩者中被訪問。函數(shù)func2中也說明了一個同名的局部變量count,但func2訪問count時,僅訪問自己說明的局部變量count,而不是那個全局變量count。注意: 全局變量和某一函數(shù)的局部變量同名時,在函數(shù)內對該名的訪問權僅針對局部變量,對全局變量無任何影響。程序執(zhí)行結果為:。count is 100 / 9個“?!背绦蚍?/p>

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

9、n說明的全局變量稱為外部變量。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中復制過來的,并將分類符extern加在說明之前。extern告訴編譯程序,如下變量的類型和名字已在別處說明過了。 17穩(wěn)定的具有固定的內存地址的變量稱為靜態(tài)變量; ( 或:用static 修飾的變量); 靜態(tài)變量不象動態(tài)變量是在程序

10、執(zhí)行過程中被動態(tài)建立、動態(tài)撤消的。靜態(tài)變量的定義格式為:static 變量類型 變量列表;靜態(tài)變量又可分為靜態(tài)局部變量和靜態(tài)全局變量。靜態(tài)局部變量:是指定義在模塊內部的靜態(tài)變量。它與局部變量的共同點是:都是局限于某個模塊內部;僅在該模塊內是有效的;4、靜態(tài)變量18 局部變量僅存在于該模塊被調用時,函數(shù)退出后,該變量就消失了。因此,它沒有連續(xù)性,在末賦初值時,其值不定;而靜態(tài)局部變量是始終存在的,即使退出該模塊,變量仍然有效。這是因為它在內存中占有固定的單元,在多次調用該模塊時,可以保持此變量的連續(xù)性。它們的不同點是: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;例:說明靜態(tài)局部變量與局部變量的區(qū)別;20在上例中,函數(shù)abc( )中的if語句if(z = 0) m = 0; n = 0; 是為了同時給m , n 賦值。然而多次調用函數(shù)abc( ),n的初值在起作用,

12、保持了連續(xù)性。而m 初值沒有起作用,沒有連續(xù)性。語句 m += x + y; 在z != 1以后的多次調用中,結果為不確定(因為沒有被賦值)。程序運行結果:m = 0, n = 0;m = *, n = 15m = *, n = 30; m = *, n = 45;m = *, n = 60;其中 * 表示不確定值。程序說明:21 用static修飾全局變量稱為靜態(tài)全局變量。靜態(tài)全局變量與全局變量在形式上類似,但意義不同。靜態(tài)全局變量只在它被定義的源文件中是有效的(該文件可以有幾個函數(shù)),而在任何別的源文件中則是無效的。而全局變量通過extern修飾后可以作用于一個程序的多個源文件中。 靜態(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);運行結果: k1 = 20, k2 = 60;23程序說明: 這個程序有三個函數(shù):main, f1, f2。其中函數(shù)f2單獨作為一個文件,main和f

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

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

16、 ; e ; e-)temp = temp * m;return(temp);程序說明: 其中e和temp因用在循環(huán)中而又都說明為register變量,由于register變量可以提高速度,因此它是最理想的循環(huán)控制變量。例:求M的e次冪。27最后總結:全局變量和靜態(tài)變量只在程序的開始一次生成;局部變量和寄存器變量在進入定義它們的程序塊和每個入口多次生成;沒有賦值的局部變量和寄存器變量在第一個賦值語句之前是末知的。例1:不同存儲類變量的應用;例2:自動類與局部靜態(tài)類變量的應用;例3:由多個文件組成的程序中變量的作用域;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;/例:不同存儲類型變量的應用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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論