第十二章_c語言標識符和存儲類解析_第1頁
第十二章_c語言標識符和存儲類解析_第2頁
第十二章_c語言標識符和存儲類解析_第3頁
第十二章_c語言標識符和存儲類解析_第4頁
第十二章_c語言標識符和存儲類解析_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C C語言程序設(shè)計語言程序設(shè)計 第第1212章章 C C語言中用戶標識符的作用域和存儲類語言中用戶標識符的作用域和存儲類v變量的屬性變量的屬性l操作屬性操作屬性 變量所持有的數(shù)據(jù)的性質(zhì)(數(shù)據(jù)類型)變量所持有的數(shù)據(jù)的性質(zhì)(數(shù)據(jù)類型)l存儲屬性存儲屬性u存儲器類型:寄存器、靜態(tài)存儲區(qū)、動態(tài)存儲區(qū)存儲器類型:寄存器、靜態(tài)存儲區(qū)、動態(tài)存儲區(qū)u生存期:變量在某一時刻存在生存期:變量在某一時刻存在-靜態(tài)變量靜態(tài)變量與與動態(tài)變動態(tài)變量量u作用域:變量在某區(qū)域內(nèi)有效作用域:變量在某區(qū)域內(nèi)有效-局部變量局部變量與與全局變?nèi)肿兞苛縱變量的存儲類型變量的存儲類型lauto -自動型自動型lregister-寄存器

2、型寄存器型lstatic -靜態(tài)型靜態(tài)型lextern -外部型外部型v變量定義格式變量定義格式: 存儲類型存儲類型 數(shù)據(jù)類型數(shù)據(jù)類型 變量表變量表;如: int sum; auto int a,b,c; register int i; static float x,y;v變量的作用域l程序中所聲明的變量在程序的那一部分中是可用的。l只有在自己的作用域中才可用。 v內(nèi)部變量-局部變量l定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效l說明:umain中定義的變量只在main中有效u不同函數(shù)中同名變量,占不同內(nèi)存單元u形參屬于局部變量u可定義在復合語句中有效的變量u局部變量可用存儲類型:auto regis

3、ter static (默認為auto)float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,n; .a,b,c有效x,y,i,j有效m,n有效從作用域角度考慮分為:內(nèi)部變量、外部變量v內(nèi)部變量內(nèi)部變量(局部變量)(局部變量)的作用域的作用域:是定義它的:是定義它的函數(shù)內(nèi)函數(shù)內(nèi)或或復合語句內(nèi)復合語句內(nèi),在它的作用域,在它的作用域之外之外,內(nèi)部變量是,內(nèi)部變量是不可不可見見的,也就是說,一個函數(shù)內(nèi)定義的內(nèi)部變量是的,也就是說,一個函數(shù)內(nèi)定義的內(nèi)部變量是不能不能被被其它的函數(shù)所引用的。其它的函數(shù)所引用的。v特性:有

4、助實現(xiàn)信息特性:有助實現(xiàn)信息隱蔽隱蔽,即使,即使不同的函數(shù)不同的函數(shù)定義了定義了同同名名的內(nèi)部變量,也不會相互影響。的內(nèi)部變量,也不會相互影響。復合語句中變量復合語句中變量#define N 5main() int i; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);運行結(jié)果:5 4 3 2 1例例 不同函數(shù)中同名變量不同函數(shù)中同名變量#include main() int a,b; a=3; b=4; printf(main:a=

5、%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);運行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4外部變量(全局變量)(全局變量)定義定義:在函數(shù)外面定義的變量。外部變量的作用域外部變量的作用域:對于對于只有一個只有一個源程序文件構(gòu)成源程序文件構(gòu)成的程序,外部變量的作用域是的程序,外部變量的作用域是從定義它的位置開始從定義它的位置開始,直,直至它所在至它所在源程序文件源程序文件的結(jié)束。的結(jié)束。特點:特點:外部變

6、量的使用外部變量的使用增加增加了函數(shù)之間傳遞數(shù)據(jù)的途了函數(shù)之間傳遞數(shù)據(jù)的途徑,在外部變量的作用域內(nèi)的徑,在外部變量的作用域內(nèi)的任何函數(shù)任何函數(shù)都能引用該外部都能引用該外部變量變量,一個函數(shù)對外部變量的,一個函數(shù)對外部變量的修改修改,能影響到其它引用,能影響到其它引用這個變量的函數(shù);因此對外部變量的使用不當,會產(chǎn)生這個變量的函數(shù);因此對外部變量的使用不當,會產(chǎn)生意外的錯誤意外的錯誤。float max,min;float average(int n) int i; float x; scanf(“%f”,&x); max=min=x; for(i=2;imax) max=x; else

7、if(xmin) min=x; sum+=x; return(sum/n);main() int n; float ave; scanf(“%d”,&n); ave=average(n); printf(max=%6.2fnmin=%6.2fn average=%6.2fn,max,min,ave);作用域maxmin#include int a=3,b=5;max( int a, int b) int c; c=ab?a:b; return(c);main() int a=8; printf(“a=%dn,b=%dn,max=%dn, a,b,max(a,b);外部變量與局部變量同名

8、時,在內(nèi)部變量的作用域中,外部變量被屏蔽。例: 運行結(jié)果:a=8 /*main中的a*/b=5 /*main中的b*/max=8外部變量的作用域可以通過關(guān)鍵字外部變量的作用域可以通過關(guān)鍵字“extern”來擴展:來擴展:int max(int x, int y) int z; z=xy?x:y; return(z);main() extern int a,b;/*當全局變量的定義在后,當全局變量的定義在后,要對引用它的變量要對引用它的變量 用用extern作說明;作說明;*/ printf(max=%d,max(a,b);int a=13,b=-8;運行結(jié)果:max=13extern int

9、a,b;int max() int z; z=ab?a:b; return(z);main() printf(max=%d,max();int a=13,b=-8; 應盡量少使用全局變量,因為:Y全局變量在程序全部執(zhí)行過程中占用存儲單元Y降低了函數(shù)的通用性、可靠性,可移植性Y降低程序清晰性,容易出錯 定義 說明u次數(shù): 只能1次 可說明多次u位置: 所有函數(shù)之外 函數(shù)內(nèi)或函數(shù)外u分配內(nèi)存: 分配內(nèi)存,可初始化 不分配內(nèi)存,不可初始化外部變量定義與外部變量說明不同: 在同一個文件中,在同一個文件中,定義定義在在后后使用使用在在前前的的外部變量外部變量,在,在使用前需要對其進行使用前需要對其進行聲

10、明聲明。 在包含在包含多個文件多個文件的程序中,的程序中,一個文件一個文件若使用若使用其它文件其它文件中中定義的外部變量也要進行聲明定義的外部變量也要進行聲明。外部變量說明: extern 數(shù)據(jù)類型 變量表;12.3.2 變量的存儲類別-動態(tài)變量與靜態(tài)變量v動態(tài)變量:動態(tài)變量:動態(tài)存儲類別的變量當動態(tài)存儲類別的變量當進入進入定義它的函數(shù)或復合語句定義它的函數(shù)或復合語句時被時被分配分配存儲空間,當存儲空間,當離開離開時所占內(nèi)存時所占內(nèi)存空間被釋放空間被釋放。 v 靜態(tài)變量:靜態(tài)變量:靜態(tài)存儲類別的變量在靜態(tài)存儲類別的變量在源程序編譯的時候源程序編譯的時候被分配固定被分配固定的存儲空間,從程序開始

11、執(zhí)行到程序運行結(jié)束,一直占用該內(nèi)存的存儲空間,從程序開始執(zhí)行到程序運行結(jié)束,一直占用該內(nèi)存空間,直至程序運行結(jié)束,才被釋放空間,直至程序運行結(jié)束,才被釋放內(nèi)存空間內(nèi)存空間。程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)全局變量、局部靜態(tài)變量形參變量局部動態(tài)變量(auto register)函數(shù)調(diào)用現(xiàn)場保護和返回地址等v生存期-變量存在(在內(nèi)存有存儲空間)的時間段。l靜態(tài)變量:從程序開始執(zhí)行到程序結(jié)束l動態(tài)變量:從包含該變量定義的函數(shù)開始執(zhí)行至函數(shù)執(zhí)行結(jié)束12.3.3 內(nèi)部變量的存儲類別 內(nèi)部變量可以定義為: 自動的(自動的(auto ) 寄存器(寄存器(register ) 靜態(tài)的靜態(tài)的(static stati

12、c ) v自動的(自動的(auto ):在函數(shù)內(nèi)定義的變量都是自動的。):在函數(shù)內(nèi)定義的變量都是自動的。 main() int a; /*等價于:等價于:auto int a;*/ v寄存器變量寄存器變量(register ) 如:如:register int i;動態(tài)變量靜態(tài)變量用register說明的變量建議編譯程序?qū)⒆兞康闹当4嬖贑PU的寄存器中,不占內(nèi)存單元.目的提高程序的運行速度.說明:少量的寄存器變量. 沒有地址概念. 用完之后盡快釋放,以提高寄存器的利用率.例 auto 變量的作用域main() int x=1; void prt(void); int x=3; prt(); p

13、rintf(“2nd x=%dn”,x); printf(“1st x=%dn”,x);void prt(void) int x=5; printf(“3th x=%dn”,x);運行結(jié)果:3th x=52nd x=31st x=1x=1作用域x=1作用域x=3作用域x=5作用域v靜態(tài)的靜態(tài)的(static static ):): 如:如:static int i; 下次再調(diào)用該函數(shù)時,下次再調(diào)用該函數(shù)時,staic變量仍使用原來的存儲單元,變量仍使用原來的存儲單元,仍使用原來存儲單元中的值。仍使用原來存儲單元中的值。 分配內(nèi)存后、賦初值,并且只被賦初值分配內(nèi)存后、賦初值,并且只被賦初值一次一

14、次,未賦值的,未賦值的內(nèi)部內(nèi)部staic變量,系統(tǒng)自動給它賦值變量,系統(tǒng)自動給它賦值為為0。被分配在內(nèi)存的被分配在內(nèi)存的靜態(tài)存儲區(qū)中靜態(tài)存儲區(qū)中。 staic變量變量在內(nèi)存的靜態(tài)存儲區(qū)占用的在內(nèi)存的靜態(tài)存儲區(qū)占用的固定固定的內(nèi)存單元;的內(nèi)存單元;即使它所在的函數(shù)被調(diào)用結(jié)束后,也即使它所在的函數(shù)被調(diào)用結(jié)束后,也不釋放存儲單元不釋放存儲單元,它,它所在單元的值也會所在單元的值也會繼續(xù)保留繼續(xù)保留-因此:因此:其它其它函數(shù)是不能引用它的。函數(shù)是不能引用它的。 #include stdio.hvoid test_a_s()auto int auto_v=0; /*內(nèi)部自動的內(nèi)部自動的*/ static

15、 int static_v=0; /*內(nèi)部靜態(tài)的內(nèi)部靜態(tài)的*/ printf(nauto_v=%d,static_v=%d,auto_v,static_v); auto_v+; static_v+;main()int i; for(i=0;i3;i+) test_a_s();例運行結(jié)果: auto_v=0,static_v=0auto_v=0,static_v=1 auto_v=0,static_v=2 利用靜態(tài)變量的情況:long func(long i) static long k=1; k=k*i;return (k);main()long n,m; printf(n); scanf(%

16、ld,&n); for (m=1L;m=n;m+) printf(n%ld!=%ld, m,func(m);例 5.9計算 1!、2!、3!、n!(n的值由鍵盤輸入) 不利用靜態(tài)變量的情況:#include long func(long n) long k=1;int i; for(i=1;i=n;i+) k=k*i;return (k);main()long n,m; printf(n); scanf(%ld,&n); for (m=1L;m=n;m+) printf(n%ld!=%ld,m,func(m);變量存儲類型靜態(tài)動態(tài)存儲方式程序整個運行期間函數(shù)調(diào)用開始至結(jié)束生存期

17、編譯時賦初值,只賦一次每次函數(shù)調(diào)用時賦初值自動賦初值0或空字符不確定未賦初值靜態(tài)存儲區(qū)動態(tài)區(qū)存儲區(qū)寄存器局部變量外部變量作用域定義變量的函數(shù)或復合語句內(nèi)本文件其它文件u局部變量默認為auto型uregister型變量個數(shù)受限,且不能為long, double, float型u局部static變量具有全局壽命和局部可見性u局部static變量具有可繼承性uexternextern不是變量定義,可擴展外部變量作用域register局部staticauto外部static外部存儲類別12.4 12.4 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)12.4.1 外部函數(shù)外部函數(shù) 外部函數(shù)是可以被程序中的外部函

18、數(shù)是可以被程序中的其它文件其它文件所調(diào)用的函數(shù)。所調(diào)用的函數(shù)。 定義格式如下:定義格式如下: extern 數(shù)據(jù)類型數(shù)據(jù)類型 函數(shù)名(形式參數(shù)表列函數(shù)名(形式參數(shù)表列) 說明部分;說明部分; 執(zhí)行部分;執(zhí)行部分; 外部函數(shù)是外部函數(shù)是C語言默認的函數(shù)語言默認的函數(shù)類型,若沒有特別的聲明類型,若沒有特別的聲明為為extern類型,系統(tǒng)也會默認為外部函數(shù)。類型,系統(tǒng)也會默認為外部函數(shù)。12.4.2 內(nèi)部函數(shù)內(nèi)部函數(shù)內(nèi)部函數(shù)內(nèi)部函數(shù)是只能被是只能被本文件中其它函數(shù)調(diào)用本文件中其它函數(shù)調(diào)用,而不,而不能被其它文件調(diào)用的函數(shù)。能被其它文件調(diào)用的函數(shù)。 它的定義格式如下:它的定義格式如下:static 數(shù)據(jù)類型數(shù)據(jù)類型 函數(shù)名(形式參數(shù)表列)函數(shù)名(形式參數(shù)表列) 說明部分;說明部分; 執(zhí)行部分;執(zhí)行部分; 有以下程序:有以下程序:#include main() int i=1,j=3; printf(“%d,”,i+); int i=0; i+=j*2; printf(“%d,%d,”,i,j);printf(“%d,%dn”,i,j);輸出結(jié)果:,輸出結(jié)果:,有以下程序:有以下程序:#include void sub(int *,int *);main() int a=1,2,

溫馨提示

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

評論

0/150

提交評論