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

下載本文檔

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

文檔簡介

1、第12章 用戶標(biāo)識符的作用域和存儲類別12.1 12.1 局部變量、全局變量和存儲分類局部變量、全局變量和存儲分類12.1.1 12.1.1 作用域作用域一個標(biāo)識符的有效范圍,稱為其作用域。一個標(biāo)識符的有效范圍,稱為其作用域。12.1.2 12.1.2 局部變量、全局變量和存儲分類局部變量、全局變量和存儲分類局部變量:函數(shù)內(nèi)部、復(fù)合語句內(nèi)部;形參局部變量:函數(shù)內(nèi)部、復(fù)合語句內(nèi)部;形參全局變量:函數(shù)外部全局變量:函數(shù)外部存儲類別:自動類(局部變量)、靜態(tài)類(局部變存儲類別:自動類(局部變量)、靜態(tài)類(局部變量、全局變量)量、全局變量)存儲類別確定了所說明對象在內(nèi)存中的存儲位置,從而也確定了所說明

2、對象的作用域和生存期。動態(tài)存儲區(qū)動態(tài)存儲區(qū)靜態(tài)存儲區(qū)程序代碼區(qū)函數(shù)調(diào)用時的返回地址函數(shù)調(diào)用時的返回地址自動類別的局部變量自動類別的局部變量全局變量全局變量靜態(tài)類別的局部變量靜態(tài)類別的局部變量12.2 12.2 局部變量局部變量12.2.1 auto 12.2.1 auto 變量變量 指在函數(shù)內(nèi)部或復(fù)合語句內(nèi)部定義指在函數(shù)內(nèi)部或復(fù)合語句內(nèi)部定義變量時,沒有指定存儲類別的情況。或者使用變量時,沒有指定存儲類別的情況。或者使用autoauto說明符。說明符。 autoauto變量的存儲單元被分配在變量的存儲單元被分配在動態(tài)動態(tài)存儲區(qū)存儲區(qū)。 每當(dāng)進(jìn)入函數(shù)體(或復(fù)合語句)時,每當(dāng)進(jìn)入函數(shù)體(或復(fù)合語句

3、)時,系統(tǒng)自動為系統(tǒng)自動為autoauto型變量分配存儲單元,退出時自型變量分配存儲單元,退出時自動釋放這些單元。動釋放這些單元。 這類變量的作用域是定義它這類變量的作用域是定義它的函數(shù)體或復(fù)合語句。的函數(shù)體或復(fù)合語句。例例 main( ) int a,b; /* a、b的作用域是整個函數(shù)體的作用域是整個函數(shù)體*/ int c; /*c的作用域是該復(fù)合語句的作用域是該復(fù)合語句*/ c=a+b; 其他說明:其他說明:1 1、形參形參也是局部變量。也是局部變量。2 2、內(nèi)層作用域的局部變量,能夠、內(nèi)層作用域的局部變量,能夠屏蔽屏蔽外層作外層作用域的同名變量。用域的同名變量。main( ) int

4、a,b,c; /* a,b,c的作用域是整個函數(shù)體的作用域是整個函數(shù)體*/ int c; /*c的作用域是該復(fù)合語句的作用域是該復(fù)合語句*/ c=a+b; 12.2.2 register12.2.2 register變量變量 程序運行時,將程序運行時,將優(yōu)先優(yōu)先把把registerregister變量存入變量存入寄存器寄存器中,以提高訪問速度。中,以提高訪問速度。 但一般編譯系統(tǒng)都能但一般編譯系統(tǒng)都能自動優(yōu)化自動優(yōu)化寄存器的分寄存器的分配,故定義配,故定義registerregister變量變量已無必要已無必要。12.2.3 12.2.3 靜態(tài)存儲類的局部變量靜態(tài)存儲類的局部變量 1 1在函數(shù)

5、體(復(fù)合語句)內(nèi)部定義變量時用在函數(shù)體(復(fù)合語句)內(nèi)部定義變量時用staticstatic來說明。如:來說明。如:static int a;static int a; 2 2靜態(tài)局部變量的存儲空間,在函數(shù)返回時靜態(tài)局部變量的存儲空間,在函數(shù)返回時并不釋放,而一直保持到整個程序運行結(jié)并不釋放,而一直保持到整個程序運行結(jié)束。束。 3 3靜態(tài)局部變量在靜態(tài)局部變量在編譯時編譯時進(jìn)行初始化,且只進(jìn)行初始化,且只進(jìn)行進(jìn)行一次一次初始化。初始化。 12.3 12.3 全局變量全局變量 1 1、全局變量是指在函數(shù)外部定義的變量。、全局變量是指在函數(shù)外部定義的變量。 2 2、全局變量的作用域是從定義點至整個程

6、、全局變量的作用域是從定義點至整個程序文件的末尾。序文件的末尾。 例例 int p=1,q=5;int p=1,q=5; / /* *p p、q q是全局變量是全局變量* */ / float f1(int a) float f1(int a) int b,c; int b,c; char c1,c2;char c1,c2; / /* *c1c1、c2c2是全局變量是全局變量* */ / char f2( int x,int y) char f2( int x,int y) int i,j; int i,j; main() main() int m,n; int m,n; 3 3、全局變量通常

7、用于、全局變量通常用于在不同函數(shù)之間傳遞數(shù)據(jù)在不同函數(shù)之間傳遞數(shù)據(jù)。int m; /int m; /* *全局變量全局變量* */ /void max(int a,int b,int c)void max(int a,int b,int c)if(ab) m=a; if(ab) m=a; else m=b; else m=b; if(cn) m=c; if(cn) m=c; main()main()int x,y,z;int x,y,z; scanf(%d%d%d,&x,&y,&z); scanf(%d%d%d,&x,&y,&z); max(x,

8、y,z); max(x,y,z); printf(m=%dn,m); printf(m=%dn,m);4 4、局部變量能夠、局部變量能夠屏蔽屏蔽同名的同名的全局變量全局變量#include int k=6;main( ) printf(%dn,k); /* k=6 */ int k=9; k+; printf(%dn,k); /* k=10*/ k+; printf(%dn,k); /* k=7 */5 5、不建議使用、不建議使用全局變量全局變量(1)不論是否需要,全局變量在整個程序運行期間都占)不論是否需要,全局變量在整個程序運行期間都占用內(nèi)存空間用內(nèi)存空間(2)全局變量必須在函數(shù)以外定義,

9、降低了函數(shù)的通用)全局變量必須在函數(shù)以外定義,降低了函數(shù)的通用性,影響了函數(shù)的獨立性性,影響了函數(shù)的獨立性(3)使用全局變量容易因疏忽或使用不當(dāng)而導(dǎo)致全局變)使用全局變量容易因疏忽或使用不當(dāng)而導(dǎo)致全局變量中的值意外改變,從而引起副作用,產(chǎn)生難以查量中的值意外改變,從而引起副作用,產(chǎn)生難以查找的錯誤。找的錯誤。12.3.2 12.3.2 在同一編譯單位內(nèi)用在同一編譯單位內(nèi)用externextern說明說明符擴(kuò)展全局變量的作用域符擴(kuò)展全局變量的作用域 當(dāng)全局變量定義在后,引用它的函數(shù)在前當(dāng)全局變量定義在后,引用它的函數(shù)在前時,應(yīng)該在引用它的函數(shù)中用時,應(yīng)該在引用它的函數(shù)中用externextern

10、對此全局變量對此全局變量進(jìn)行說明,以便通知編譯程序:該變量是一個已經(jīng)進(jìn)行說明,以便通知編譯程序:該變量是一個已經(jīng)在外部定義了的全局變量,已經(jīng)分配了存儲單元,在外部定義了的全局變量,已經(jīng)分配了存儲單元,不需要再另外開辟空間。這時,該全局變量的作用不需要再另外開辟空間。這時,該全局變量的作用域從域從externextern說明處開始,到該函數(shù)的末尾結(jié)束。說明處開始,到該函數(shù)的末尾結(jié)束。12.3.3 12.3.3 在不同的編譯單位內(nèi)用在不同的編譯單位內(nèi)用externextern說明說明符擴(kuò)展全局變量的作用域符擴(kuò)展全局變量的作用域 實際應(yīng)用中,一個實際應(yīng)用中,一個C C程序通常由許多函數(shù)程序通常由許多

11、函數(shù)組成,這些函數(shù)可以分別存放在不同的源文件中,組成,這些函數(shù)可以分別存放在不同的源文件中,每個源文件可以單獨編譯,進(jìn)行語法檢查,如無錯每個源文件可以單獨編譯,進(jìn)行語法檢查,如無錯誤即生成目標(biāo)文件誤即生成目標(biāo)文件.obj.obj。然后通過連接程序把多個。然后通過連接程序把多個目標(biāo)文件連接成可執(zhí)行文件目標(biāo)文件連接成可執(zhí)行文件.exe.exe。這些可單獨編譯。這些可單獨編譯的源文件稱為的源文件稱為“編譯單位編譯單位”。12.3.3 12.3.3 在不同的編譯單位內(nèi)用在不同的編譯單位內(nèi)用externextern說明說明符擴(kuò)展全局變量的作用域符擴(kuò)展全局變量的作用域 當(dāng)一個程序由多個編譯單位組成,并且在

12、當(dāng)一個程序由多個編譯單位組成,并且在每個文件中均需要引用同一個全局變量時:每個文件中均需要引用同一個全局變量時: 如果在每一個文件中都定義一個同名全局如果在每一個文件中都定義一個同名全局變量,連接時會產(chǎn)生變量,連接時會產(chǎn)生“重復(fù)定義重復(fù)定義”的錯誤。的錯誤。 解決辦法:在一個文件中定義所需要引解決辦法:在一個文件中定義所需要引用的全局變量,在其他文件中用用的全局變量,在其他文件中用externextern對這些變量對這些變量進(jìn)行說明。進(jìn)行說明。12.4 12.4 函數(shù)的存儲類別函數(shù)的存儲類別1 1externextern函數(shù)函數(shù) 用于用于擴(kuò)展擴(kuò)展函數(shù)的作用域。函數(shù)的作用域。2 2staticstatic函數(shù)函數(shù) 用于用于限制限制函數(shù)的作用域。函數(shù)的作用域。例例 靜態(tài)局部變量應(yīng)用。靜態(tài)局部變量應(yīng)用。#include #include int fac(int n)int fac(int n)static int f=1;static int f=1; / /* *f f只進(jìn)行一次初始化只進(jìn)行一次初始化* */ / f=f f=f* *n;n; return(f); return(f

溫馨提示

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

評論

0/150

提交評論