C語(yǔ)言教程同步課件10講(第7章)_第1頁(yè)
C語(yǔ)言教程同步課件10講(第7章)_第2頁(yè)
C語(yǔ)言教程同步課件10講(第7章)_第3頁(yè)
C語(yǔ)言教程同步課件10講(第7章)_第4頁(yè)
C語(yǔ)言教程同步課件10講(第7章)_第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、第十講 作用范圍和存儲(chǔ)類別,2,第十講 作用范圍和存儲(chǔ)類別,作用范圍 存儲(chǔ)類別 包含多個(gè)源文件的程序,C語(yǔ)言程序設(shè)計(jì),3,簡(jiǎn)介,變量定義的完整格式: 數(shù)據(jù)類型 占據(jù)存儲(chǔ)空間的大小 取值范圍 存儲(chǔ)類別 在內(nèi)存中持續(xù)的時(shí)間(生存期) 在硬件中存放的位置 其它屬性 作用范圍 可以被引用的程序部分(可見性),作用范圍和存儲(chǔ)類別,4,標(biāo)識(shí)符的作用域,標(biāo)識(shí)符的作用域是指一個(gè)標(biāo)識(shí)符,包括變量名、函數(shù)名等,在程序中可以被使用的范圍。(在這個(gè)范圍內(nèi)引用該標(biāo)識(shí)符是合法的,而在這個(gè)范圍之外,該標(biāo)識(shí)符是不能被引用的) 在C語(yǔ)言中可以在函數(shù)內(nèi)部、函數(shù)外部以及函數(shù)的參數(shù)中定義變量,定義的位置不同,變量的作用域也不同。變量

2、的作用域也稱為可見性,變量的聲明方式不同,其作用域也不同。 C語(yǔ)言中的變量,按作用域范圍可分為兩種,即局部變量和全局變量。,作用范圍和存儲(chǔ)類別,5,局部變量,在一個(gè)函數(shù)內(nèi)部定義的變量被稱作局部變量(形式參數(shù)也是局部變量),這種變量的作用域是在本函數(shù)范圍內(nèi),即從變量定義的位置開始,到函數(shù)體結(jié)束。通俗一點(diǎn)說(shuō),局部變量只能在定義它的函數(shù)內(nèi)部使用,而不能在其它函數(shù)內(nèi)使用這個(gè)變量。,作用范圍和存儲(chǔ)類別,6,局部變量,說(shuō)明: 1、main函數(shù)也是一個(gè)函數(shù),它內(nèi)部定義的變量也只能在main函數(shù)內(nèi)部使用,不能在其它函數(shù)中使用。同樣,主函數(shù)中也不能使用其他函數(shù)中定義的變量。 2、不同的函數(shù)中可以使用同名的變量,

3、這些局部變量代表不同的對(duì)象,分配不同的存儲(chǔ)單元,不會(huì)互相干影響。 3、形參變量是屬于被調(diào)函數(shù)的局部變量,實(shí)參變量是屬于主調(diào)函數(shù)的局部變量。 4、在復(fù)合語(yǔ)句內(nèi)部也可以定義變量,這些變量的作用域只在本復(fù)合語(yǔ)句中。,作用范圍和存儲(chǔ)類別,例,int fun_a(int a) int b,c; . int fun_b(int x) int y,z; main() int m,n; ,a,b,c作用域在fun_a內(nèi),同樣,x,y,z作用域在fun_b內(nèi),m,n作用域在main內(nèi),main() int s,a; . int b; s=a+b; . . ,b的作用域在復(fù)合語(yǔ)句內(nèi),s,a的作用域在main內(nèi),8

4、,例,作用范圍和存儲(chǔ)類別,10-1.c #include fun() int n=6; printf(n in fun:%dn,n); void main() int n=3; fun(); printf(n in main:%dn,n); ,10-2.c #include void main() int i=2,j=3,k; k=i+j; int k=8; if(i=3) printf(%dn,k); printf(%dn%dn,i,k); ,9,全局變量,在函數(shù)外定義的變量稱為全局變量,也稱為外部變量。全局變量的作用域是從定義變量的位置開始到本源文件結(jié)束。這樣全局變量可以讓很多函數(shù)都使用它

5、。全局變量一經(jīng)定義,編譯系統(tǒng)會(huì)為其分配固定的內(nèi)存單元,在程序運(yùn)行時(shí)始終都占用固定內(nèi)存單元。,作用范圍和存儲(chǔ)類別,10,全局變量,說(shuō)明: 1、對(duì)于局部變量的定義和說(shuō)明,可以不加區(qū)分。而對(duì)于全局變量則不然,全局變量的定義和全局變量的說(shuō)明并不是一回事。全局變量定義必須在所有的函數(shù)之外,且只能定義一次。當(dāng)需要在全局變量定義位置之前引用它,應(yīng)該使用extern對(duì)該變量進(jìn)行聲明,即可在同一文件內(nèi)部擴(kuò)展全局變量的作用域。全局變量聲明的格式為:extern 類型說(shuō)明符 變量名; 2、全局變量的初始化只能有一次,是在對(duì)全局變量進(jìn)行定義的時(shí)候。 3、全局變量的作用是使得函數(shù)間多了一種傳遞信息的方式。如果在一個(gè)程序

6、中各個(gè)函數(shù)都要對(duì)同一個(gè)信息進(jìn)行處理,就可以將這個(gè)信息定義成全局變量。另外,采用這種方式,可以從某個(gè)函數(shù)內(nèi)部得到多個(gè)計(jì)算值。(注,使用全局變量會(huì)使函數(shù)的獨(dú)立性降低,因此在不必要時(shí)盡量不要使用全局變量) 4、在同一個(gè)源文件中,如果局部變量和全局變量重名,則在局部變量的作用域內(nèi),全局變量不起作用。,作用范圍和存儲(chǔ)類別,例,int a,b; void fun1() . float x,y; int fun2() . main() .,全局變量a,b作用域,全局變量x,y作用域,10-3.c #include int X=1; printx(); void main() printf(X in main

7、:%dn,X); printx(); printf(X in main:%dn,X); printx() int X=2; printf(X in printx:%dn,X); ,變量的存儲(chǔ)類別,求15的階乘,并將它們依次輸出。10-4.c #include void fac(int n) static int f=1; f=f*n; printf(%d!=%dn,n,f); void main() int i; for(i=1;i=5;i+) fac(i); ,為使函數(shù)中的局部變量f在函數(shù)調(diào)用結(jié)束后仍能保留,在下一次調(diào)用時(shí)繼續(xù)使用,實(shí)現(xiàn)方法是將變量f的存儲(chǔ)類別定義為靜態(tài)的。,變量的存儲(chǔ)類別,

8、由于程序在執(zhí)行過(guò)程中,程序和數(shù)據(jù)在內(nèi)存中存放的區(qū)域是有一定規(guī)定的。供用戶使用的存儲(chǔ)空間大致分為三個(gè)不同的部分: 1)程序區(qū):存放程序的可執(zhí)行代碼模塊。 2)靜態(tài)存儲(chǔ)區(qū):存放所有的全局變量以及標(biāo)明為靜態(tài)類的局部變量部分. 3)運(yùn)行棧區(qū):存放的數(shù)據(jù)又分為以下幾種。 函數(shù)調(diào)用時(shí),按序動(dòng)態(tài)存放主調(diào)函數(shù)執(zhí)行過(guò)程中的現(xiàn)場(chǎng)。此類數(shù)據(jù)存放也稱為現(xiàn)場(chǎng)保護(hù)。 所有未標(biāo)明為靜態(tài)類的局部變量。 函數(shù)的形式參數(shù)。 存放在運(yùn)行棧區(qū)的數(shù)據(jù)均采用動(dòng)態(tài)存儲(chǔ)分配方法。,變量的存儲(chǔ)方式,分為: 靜態(tài)存儲(chǔ) 在變量定義時(shí)就分配存儲(chǔ)單元并一直保持不變,直至整個(gè)程序結(jié)束。 動(dòng)態(tài)存儲(chǔ) 是在程序執(zhí)行過(guò)程中,使用它時(shí)才分配存儲(chǔ)單元,使用完畢立即

9、釋放。,15,變量的存儲(chǔ)類別,四種存儲(chǔ)類別說(shuō)明符 auto register extern static 兩種存儲(chǔ)時(shí)期 動(dòng)態(tài)存儲(chǔ)時(shí)期 auto register 靜態(tài)存儲(chǔ)時(shí)期 extern static,作用范圍和存儲(chǔ)類別,16,動(dòng)態(tài)存儲(chǔ)類別,自動(dòng)存儲(chǔ) 程序執(zhí)行到變量所在的程序塊內(nèi)時(shí)創(chuàng)建它,退出時(shí)銷毀。 不會(huì)被自動(dòng)初始化。 auto(自動(dòng)變量):局部變量的缺省類別。 程序塊中聲明的變量,函數(shù)的參數(shù)。 register(寄存器變量):建議編譯器把變量放進(jìn)高速的寄存器。 只適用于自動(dòng)變量。,作用范圍和存儲(chǔ)類別,auto int a, b;,register int count = 1;,等價(jià)于,i

10、nt a,b;,17,靜態(tài)存儲(chǔ)類別,靜態(tài)存儲(chǔ) 程序開始執(zhí)行時(shí)創(chuàng)建,在程序執(zhí)行期間,變量一直存在。 自動(dòng)被初始化,缺省初值:0 或 0。 static(靜態(tài)變量):可以用于在程序塊中定義的變量。 退出程序塊后依然存在,并保留值。 但不改變其作用范圍,即只能在所在的程序塊內(nèi)被使用。 由于所有全局變量都是靜態(tài)類型的,C語(yǔ)言規(guī)定,static通常在全局變量的定義中可以省去不寫。 靜態(tài)變量有兩種:靜態(tài)全局變量和靜態(tài)局部變量。,作用范圍和存儲(chǔ)類別,static int a, b;,靜態(tài)存儲(chǔ)類別,extern(外部變量):用來(lái)聲明在“外部”定義的全局變量。 僅用于聲明變量。 只有定義為extern類型的外部

11、變量才能供其他文件使用。外部變量的定義是在所有函數(shù)體之外,用extern或默認(rèn)存儲(chǔ)類別說(shuō)明,定義時(shí)可以給它賦初值,而且只能賦初值一次。 外部變量和全局變量是對(duì)同一類變量的兩種不同角度的提法。全局變量是從它的作用域提出的,外部變量是從它的存儲(chǔ)方式提出的,表示了它的生存期。,extern int total;,19,案例分析:存儲(chǔ)類別,存儲(chǔ)類別 讀下面的程序,寫出結(jié)果。(10-5.c),作用范圍和存儲(chǔ)類別,void try(int a) auto int b=10; static int c=10; b+; c+; printf(a=%dtb=%dtc=%dn, a, b, c); void ma

12、in() int i; for (i=1;i=3;i+) try(i); ,a=1b=11c=11 a=2b=11c=12 a=3b=11c=13,20,案例分析:存儲(chǔ)類別,存儲(chǔ)類別 結(jié)果分析,作用范圍和存儲(chǔ)類別,c,a,b,a,b,a,b,1,2,3,FF00,2208,2206,2206,2204,2204,2202,a=1b=11c=11 a=2b=11c=12 a=3b=11c=13,21,案例分析:外部變量,外部變量(10-6.c),作用范圍和存儲(chǔ)類別,#include void main() extern int a; int c=3; printf(a = %dn, a); ex

13、tern int c; c = 4; printf(inner c = %dn, c); printf(c = %dn, c); int a=1; int c=5;,a = 1 inner c = 4 c = 3,22,案例分析:作用范圍與存儲(chǔ)類別,作用范圍與存儲(chǔ)類別(cw0903.c),作用范圍和存儲(chǔ)類別,#include void a(void); void b(void); void c(void); int x = 1; void main() int x = 5; printf(local x in outer scope of main is %dn, x); int x = 7;

14、 printf(local x in inner scope of main is %dn, x); printf(nlocal x in outer scope of main is %dn, x);,23,案例分析:作用范圍與存儲(chǔ)類別,作用范圍與存儲(chǔ)類別,作用范圍和存儲(chǔ)類別,a(); b(); c(); a(); b(); c(); printf(local x in main is %dn, x); void a() int x = 25; /*initialized each time a is called*/ printf(nlocal x in a is %d after ent

15、eringn, x); x+; printf(local x in a is %d before exitingn, x); ,24,案例分析:作用范圍與存儲(chǔ)類別,作用范圍與存儲(chǔ)類別,作用范圍和存儲(chǔ)類別,void b() static int x = 50; printf(nlocal x in b is %d after enteringn, x); x+; printf(local x in b is %d before exitingn, x); void c() printf(nglobal x is %d on entering cn, x); x*=10; printf(globa

16、l x is %d on exiting cn, x); ,25,案例分析:作用范圍與存儲(chǔ)類別,作用范圍與存儲(chǔ)類別,作用范圍和存儲(chǔ)類別,local x in outer scope of main is 5 local x in inner scope of main is 7 local x in outer scope of main is 5 local x in a is 25 after entering a local x in a is 26 before exiting a local x in b is 50 after entering b local x in b is

17、51 before exiting b global x is 1 on entering c global x is 10 on exiting c,26,案例分析:作用范圍與存儲(chǔ)類別,作用范圍與存儲(chǔ)類別,作用范圍和存儲(chǔ)類別,local x in a is 25 after entering a local x in a is 26 before exiting a local x in b is 51 after entering b local x in b is 52 before exiting b global x is 10 on entering c global x is 1

18、00 on exiting c local x in main is 5,27,包含多個(gè)源文件的程序,包含多個(gè)源文件的程序 每個(gè)函數(shù)的定義必須在一個(gè)文件內(nèi),不能被分割。 全局變量可以被同一文件內(nèi)的函數(shù)訪問(wèn)。 如果需要被其他文件內(nèi)的函數(shù)訪問(wèn),則必須在其他文件內(nèi)聲明。 extern 表示變量myGlobal是在另一個(gè)文件內(nèi)定義的。 一個(gè)文件內(nèi)定義的函數(shù),也可以被其他文件內(nèi)的函數(shù)調(diào)用。 在每個(gè)文件內(nèi)加入該函數(shù)的原型(聲明為外部函數(shù))。 函數(shù)的原型可以不需要 extern。,作用范圍和存儲(chǔ)類別,int myGlobal;,extern int myGlobal;,a.c,b.c,28,包含多個(gè)源文件的程序,包含多個(gè)源文件的程序 舉例,作用范圍和存儲(chǔ)類別,int a, b; extern int max(void); void main() scanf(%d%d, ,extern int a, b; int max() return (ab?a:b); ,A,B,10-8.c,10-9.c,29,包含多個(gè)源文件的程序,包含多個(gè)源文件的程序 static 限制全局變量只能被同一文件內(nèi)的函數(shù)訪問(wèn)。 限制函數(shù)只能被同一文件內(nèi)的函數(shù)調(diào)用。,

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論