分校C課件第10講作用范圍和存儲(chǔ)類別30(35)_第1頁(yè)
分校C課件第10講作用范圍和存儲(chǔ)類別30(35)_第2頁(yè)
分校C課件第10講作用范圍和存儲(chǔ)類別30(35)_第3頁(yè)
分校C課件第10講作用范圍和存儲(chǔ)類別30(35)_第4頁(yè)
分校C課件第10講作用范圍和存儲(chǔ)類別30(35)_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C C語言程序設(shè)計(jì)教程語言程序設(shè)計(jì)教程編寫組編寫組20072007年年1 1月月黃興鼎版權(quán)所有黃興鼎版權(quán)所有作用范圍作用范圍存儲(chǔ)類別存儲(chǔ)類別包含多個(gè)源文件的程序包含多個(gè)源文件的程序黃興鼎版權(quán)所有黃興鼎版權(quán)所有標(biāo)識(shí)符的作用域例標(biāo)識(shí)符的作用域例/* cw0900.c標(biāo)識(shí)符的作用域例標(biāo)識(shí)符的作用域例*/#include void fun(int n)n=6;printf(n in fun:%dn,n);int main()int n;n=3;fun(n);printf(n in main:%dn,n); return 0;在本例中在本例中, ,形參和實(shí)參的變量名都形參和實(shí)參的變量名都為為n,n,但他

2、們的作用范圍不同但他們的作用范圍不同, ,所以所以不會(huì)互相影響。不會(huì)互相影響。在討論函數(shù)的形參變量時(shí)曾說:形參在討論函數(shù)的形參變量時(shí)曾說:形參只在被調(diào)用時(shí)才分配內(nèi)存單元,調(diào)用只在被調(diào)用時(shí)才分配內(nèi)存單元,調(diào)用結(jié)束立即釋放。可見形參只有在該函結(jié)束立即釋放。可見形參只有在該函數(shù)內(nèi)才是有效的,離開該函數(shù)就不能數(shù)內(nèi)才是有效的,離開該函數(shù)就不能再使用了。這種變量的有效性的范圍,再使用了。這種變量的有效性的范圍,稱為變量的作用域。稱為變量的作用域。黃興鼎版權(quán)所有黃興鼎版權(quán)所有不僅形參變量,不僅形參變量,C語言中所有的語言中所有的量量都有自己的作用域。都有自己的作用域。這些量都是用標(biāo)識(shí)符來說明的,所以又稱為這

3、些量都是用標(biāo)識(shí)符來說明的,所以又稱為標(biāo)識(shí)符的作用標(biāo)識(shí)符的作用域。域。標(biāo)識(shí)符包括變量名、函數(shù)名等,標(biāo)識(shí)符包括變量名、函數(shù)名等,作用域就是指在程序作用域就是指在程序中可以被使用的范圍。中可以被使用的范圍。在C語言中可以在函數(shù)內(nèi)部、外部和函數(shù)的參數(shù)中定義和聲明變量,定義和聲明的位置不同定義和聲明的位置不同,變量的作用域不同變量的作用域不同,變量的作用域也稱為可見性可見性。變量的聲明方式不同,其作用域也不同。C語言中的變量,按作用域范圍可分為兩種,即局部變量局部變量和全局變量全局變量。黃興鼎版權(quán)所有黃興鼎版權(quán)所有簡(jiǎn)介簡(jiǎn)介變量定義的完整格式:變量定義的完整格式: 數(shù)據(jù)類型數(shù)據(jù)類型占據(jù)存儲(chǔ)空間的大小占據(jù)存

4、儲(chǔ)空間的大小取值范圍取值范圍存儲(chǔ)類別存儲(chǔ)類別在內(nèi)存中持續(xù)的時(shí)間(生存期)在內(nèi)存中持續(xù)的時(shí)間(生存期)在硬件中存放的位置在硬件中存放的位置其它屬性其它屬性作用范圍作用范圍 可以被引用的程序部分(可見性)可以被引用的程序部分(可見性)作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別前面幾章中,我們已經(jīng)知前面幾章中,我們已經(jīng)知道變量的數(shù)據(jù)類型和變量道變量的數(shù)據(jù)類型和變量名的有關(guān)規(guī)定,這一章主名的有關(guān)規(guī)定,這一章主要介紹存儲(chǔ)類別。要介紹存儲(chǔ)類別。C語言程序運(yùn)行語言程序運(yùn)行內(nèi)存的分配內(nèi)存的分配1 代碼代碼2 靜態(tài)數(shù)據(jù)靜態(tài)數(shù)據(jù)3 動(dòng)態(tài)數(shù)據(jù)動(dòng)態(tài)數(shù)據(jù)(棧(棧stack)4 自由空間自由空間(堆(堆heap)堆是自由空間,

5、這些空間由系統(tǒng)程序掌握,當(dāng)C程序在運(yùn)行期間要求空間時(shí),可向系統(tǒng)申請(qǐng),系統(tǒng)根據(jù)要求分配程序要求的空間,用完之后,程序又將這些空間交還給系統(tǒng)。堆堆黃興鼎版權(quán)所有黃興鼎版權(quán)所有作用范圍作用范圍程序中的所有標(biāo)識(shí)符構(gòu)成了名字空間。程序中的所有標(biāo)識(shí)符構(gòu)成了名字空間。標(biāo)識(shí)符的作用范圍標(biāo)識(shí)符的作用范圍能夠引用該標(biāo)識(shí)符的程序部分。能夠引用該標(biāo)識(shí)符的程序部分。四種作用范圍:四種作用范圍:文件作用范圍文件作用范圍函數(shù)作用范圍函數(shù)作用范圍程序塊作用范圍程序塊作用范圍函數(shù)原型作用范圍函數(shù)原型作用范圍作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別1. 1.主函數(shù)中定義的變量只在主函數(shù)中有效主函數(shù)中定義的變量只在主函數(shù)中有效, ,而

6、不因?yàn)樵谥骱瘮?shù)中定義而在而不因?yàn)樵谥骱瘮?shù)中定義而在整個(gè)文件或程序中有效。主函數(shù)也不能使用其他函數(shù)中定義的變量。整個(gè)文件或程序中有效。主函數(shù)也不能使用其他函數(shù)中定義的變量。2. 2. 不同函數(shù)中可以使用相同名字的變量不同函數(shù)中可以使用相同名字的變量, ,它們代表不同的對(duì)象它們代表不同的對(duì)象, ,互不干擾?;ゲ桓蓴_。3. 3. 形式參數(shù)也是局部變量。形式參數(shù)也是局部變量。4. 4. 在一個(gè)函數(shù)內(nèi)部在一個(gè)函數(shù)內(nèi)部, ,可以在復(fù)合語句中定義變量可以在復(fù)合語句中定義變量, ,這些變量只在本復(fù)合語句這些變量只在本復(fù)合語句中有效中有效, ,這種復(fù)合語句也稱為這種復(fù)合語句也稱為“分程序分程序”或或“程序塊程序

7、塊”。黃興鼎版權(quán)所有黃興鼎版權(quán)所有作用范圍作用范圍文件作用范圍文件作用范圍在函數(shù)外聲明的標(biāo)識(shí)符,可以在在函數(shù)外聲明的標(biāo)識(shí)符,可以在從聲明處開始的從聲明處開始的所有函數(shù)中被引用。所有函數(shù)中被引用。包括:全局變量,函數(shù)定義,函數(shù)原型。包括:全局變量,函數(shù)定義,函數(shù)原型。作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別int total;int max(int, int);int main() int limit;int max(int x, int y) 作用范圍作用范圍從聲明或定義的位置從聲明或定義的位置開始,到文件的末尾。開始,到文件的末尾。黃興鼎版權(quán)所有黃興鼎版權(quán)所有作用范圍作用范圍函數(shù)作用范圍函數(shù)作用

8、范圍在函數(shù)體內(nèi)定義的標(biāo)識(shí)符,只能在函數(shù)體內(nèi)被引用。在函數(shù)體內(nèi)定義的標(biāo)識(shí)符,只能在函數(shù)體內(nèi)被引用。包括:包括:語句標(biāo)號(hào)語句標(biāo)號(hào)作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別int main() int x; char c; loop: goto loop;內(nèi)部變量:內(nèi)部變量:在一個(gè)函數(shù)內(nèi)部定義的變?cè)谝粋€(gè)函數(shù)內(nèi)部定義的變量稱內(nèi)部變量。它只在本函數(shù)范圍內(nèi)量稱內(nèi)部變量。它只在本函數(shù)范圍內(nèi)有效,即:只有在本函數(shù)內(nèi)才能使用有效,即:只有在本函數(shù)內(nèi)才能使用這些變量,故稱為這些變量,故稱為“局部變量局部變量” 。黃興鼎版權(quán)所有黃興鼎版權(quán)所有作用范圍作用范圍程序塊作用范圍程序塊作用范圍在程序塊內(nèi)聲明的變量,在程序塊內(nèi)被引

9、用。在程序塊內(nèi)聲明的變量,在程序塊內(nèi)被引用。包括:程序塊內(nèi)的變量(局部變量),函數(shù)的參數(shù)。包括:程序塊內(nèi)的變量(局部變量),函數(shù)的參數(shù)。作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別int max(int x, int y) int main() int a=9; int a=6; 作用范圍作用范圍從聲明的位置開始,到從聲明的位置開始,到程序塊的右花括號(hào)。程序塊的右花括號(hào)。覆蓋覆蓋同名變量,內(nèi)部變量同名變量,內(nèi)部變量“覆蓋了覆蓋了”外部變量外部變量黃興鼎版權(quán)所有黃興鼎版權(quán)所有關(guān)于聲明和定義關(guān)于聲明和定義定義聲明定義聲明定義一個(gè)標(biāo)識(shí)符,同時(shí)也是聲明定義一個(gè)標(biāo)識(shí)符,同時(shí)也是聲明。但不能說聲明就是定義。但不能

10、說聲明就是定義.對(duì)于變量,定義意味著創(chuàng)建,即為其分配內(nèi)存。對(duì)于變量,定義意味著創(chuàng)建,即為其分配內(nèi)存。引用聲明引用聲明只是聲明一個(gè)需要引用的標(biāo)識(shí)符。只是聲明一個(gè)需要引用的標(biāo)識(shí)符。作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別函數(shù)原型作用范圍函數(shù)原型作用范圍函數(shù)原型中的參數(shù)函數(shù)原型中的參數(shù)。int max(int x, int y);int main() int max(int x, int y) 黃興鼎版權(quán)所有黃興鼎版權(quán)所有存儲(chǔ)類別存儲(chǔ)類別四種存儲(chǔ)類別說明符四種存儲(chǔ)類別說明符autoregisterexternstatic兩種存儲(chǔ)時(shí)期兩種存儲(chǔ)時(shí)期自動(dòng)存儲(chǔ)時(shí)期自動(dòng)存儲(chǔ)時(shí)期autoregister靜態(tài)存儲(chǔ)時(shí)期

11、靜態(tài)存儲(chǔ)時(shí)期externstatic作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別自動(dòng)存儲(chǔ)類別自動(dòng)存儲(chǔ)類別寄存器變量寄存器變量外部變量外部變量靜態(tài)變量靜態(tài)變量和函數(shù)和函數(shù)函數(shù)中的局部變量,如不專門函數(shù)中的局部變量,如不專門說明為靜態(tài)存儲(chǔ)類別說明為靜態(tài)存儲(chǔ)類別, ,都是動(dòng)態(tài)都是動(dòng)態(tài)分配存儲(chǔ)空間的分配存儲(chǔ)空間的, ,存儲(chǔ)在動(dòng)態(tài)存存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)中。對(duì)它們分配和釋放存儲(chǔ)儲(chǔ)區(qū)中。對(duì)它們分配和釋放存儲(chǔ)空間的工作由編譯系統(tǒng)自動(dòng)處理,空間的工作由編譯系統(tǒng)自動(dòng)處理,因此這類局部變量稱為自動(dòng)變量因此這類局部變量稱為自動(dòng)變量。自動(dòng)變量用關(guān)鍵字自動(dòng)變量用關(guān)鍵字autoauto作存儲(chǔ)類作存儲(chǔ)類型的說明。型的說明。函數(shù)形參為局部

12、變量,函數(shù)形參為局部變量,也為自動(dòng)變量。自動(dòng)變量存放在也為自動(dòng)變量。自動(dòng)變量存放在運(yùn)行棧區(qū)。運(yùn)行棧區(qū)。C C語言規(guī)定語言規(guī)定autoauto通常在局部變通常在局部變量的定義中可以省去不寫。量的定義中可以省去不寫。但不能說省去不寫的變量就是但不能說省去不寫的變量就是自動(dòng)變量,因?yàn)樽詣?dòng)變量,因?yàn)槿肿兞渴庆o態(tài)全局變量是靜態(tài)變量,也可以省去不寫變量,也可以省去不寫。黃興鼎版權(quán)所有黃興鼎版權(quán)所有自動(dòng)存儲(chǔ)類別自動(dòng)存儲(chǔ)類別自動(dòng)存儲(chǔ)自動(dòng)存儲(chǔ)程序執(zhí)行到變量所在的程序塊內(nèi)時(shí)創(chuàng)建它,退出時(shí)銷毀。程序執(zhí)行到變量所在的程序塊內(nèi)時(shí)創(chuàng)建它,退出時(shí)銷毀。不會(huì)被自動(dòng)初始化。不會(huì)被自動(dòng)初始化。auto(自動(dòng)變量)(自動(dòng)變量):

13、局部變量的缺省類別。:局部變量的缺省類別。不賦初值,其值不確定。不賦初值,其值不確定。程序塊中聲明的變量,函數(shù)的參數(shù)。程序塊中聲明的變量,函數(shù)的參數(shù)。作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別auto int a, b;register int count=1;使用頻繁的變量,存取其值要花費(fèi)不少時(shí)間。為提高執(zhí)行效率,語言允使用頻繁的變量,存取其值要花費(fèi)不少時(shí)間。為提高執(zhí)行效率,語言允許將局部變量動(dòng)態(tài)的值放在寄存器中,需要用時(shí)直接從寄存器取出參加運(yùn)許將局部變量動(dòng)態(tài)的值放在寄存器中,需要用時(shí)直接從寄存器取出參加運(yùn)算,不必再到內(nèi)存中去存取。由于對(duì)寄存器的存取速度遠(yuǎn)高于對(duì)內(nèi)存的存算,不必再到內(nèi)存中去存取。由

14、于對(duì)寄存器的存取速度遠(yuǎn)高于對(duì)內(nèi)存的存取速度,因此這樣做可以提高執(zhí)行效率。這種變量叫做寄存器變量。取速度,因此這樣做可以提高執(zhí)行效率。這種變量叫做寄存器變量。register(寄存器變量)(寄存器變量):建議編譯器把變量放進(jìn)高速的寄:建議編譯器把變量放進(jìn)高速的寄存器。存器。只適用于自動(dòng)變量只適用于自動(dòng)變量。黃興鼎版權(quán)所有黃興鼎版權(quán)所有靜態(tài)存儲(chǔ)類別靜態(tài)存儲(chǔ)類別靜態(tài)存儲(chǔ)靜態(tài)存儲(chǔ)程序開始執(zhí)行時(shí)創(chuàng)建,在程序執(zhí)行期間,變量一直存在。程序開始執(zhí)行時(shí)創(chuàng)建,在程序執(zhí)行期間,變量一直存在。在編譯時(shí)賦初值,在編譯時(shí)賦初值,缺省初值缺省初值時(shí)時(shí)自動(dòng)被初始化自動(dòng)被初始化為為0 或或 0。static(靜態(tài)變量)(靜態(tài)變

15、量):可以用于在程序塊中定義的變量。:可以用于在程序塊中定義的變量。退出程序塊后依然存在,并保留值。退出程序塊后依然存在,并保留值。但不改變其作用范圍,即只能在所在程序塊內(nèi)被使用。但不改變其作用范圍,即只能在所在程序塊內(nèi)被使用。extern(外部變量)(外部變量):用來聲明在:用來聲明在“外部外部”定義的全局變量。定義的全局變量。僅用于聲明變量。僅用于聲明變量。作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別static int a, b;extern int total;外部變量:外部變量:函數(shù)之外定義的變量稱為外部變函數(shù)之外定義的變量稱為外部變量。外部變量可以為本文件中其他函數(shù)所共量。外部變量可以為本

16、文件中其他函數(shù)所共用。它的有效范圍為從聲明變量的位置開始用。它的有效范圍為從聲明變量的位置開始到本源文件結(jié)束。所以也稱全局變量。到本源文件結(jié)束。所以也稱全局變量。注意區(qū)別:注意區(qū)別:0數(shù)字、數(shù)字、0和和0字字符符黃興鼎版權(quán)所有黃興鼎版權(quán)所有案例分析:存儲(chǔ)類別案例分析:存儲(chǔ)類別存儲(chǔ)類別存儲(chǔ)類別作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別void try(int a) auto int b=10; /*b是動(dòng)態(tài)變量,是動(dòng)態(tài)變量,auto可省可省,每次調(diào)用被重新賦值。每次調(diào)用被重新賦值。*/ static int c=10; /*c是靜態(tài)變量,在是靜態(tài)變量,在try函數(shù)中保持上次運(yùn)算結(jié)果不變函數(shù)中保持上次運(yùn)

17、算結(jié)果不變*/ b+; c+; printf(a=%dtb=%dtc=%dn,a,b,c);int main() int i; / i是是 Auto被省略了被省略了 /*如果下面如果下面c 定義為自動(dòng)變量定義為自動(dòng)變量,則輸出一個(gè)隨機(jī)數(shù)則輸出一個(gè)隨機(jī)數(shù),而不是而不是0, 如果如果c 是一個(gè)字符變量是一個(gè)字符變量,則輸出一個(gè)隨機(jī)字,可能是漢字。則輸出一個(gè)隨機(jī)字,可能是漢字。*/ static int c; for (i=1;i=3;i+)try(i); /*c是靜態(tài)變量是靜態(tài)變量,并未賦值。所以為并未賦值。所以為0,如果如果c是字符變量是字符變量,則輸出為空格則輸出為空格*/ printf(c=

18、%d,c); return 0;a=1b=11c=11a=2b=11c=12a=3b=11c=13c=0讀下面的程序,寫出結(jié)果。讀下面的程序,寫出結(jié)果。(cw0901.c)黃興鼎版權(quán)所有黃興鼎版權(quán)所有案例分析:外部變量案例分析:外部變量外部變量外部變量(cw0902.c)作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別#include int main() extern int a; int c=3; printf(a = %dn, a); extern int c; c=4; printf(inner c=%dn, c); printf(c=%dn, c); return 0;int a=1;int c

19、=5;a=1inner c=4c=3a是外部變量,在所有區(qū)域都為1,c在主函數(shù)中保持不變,在復(fù)合語句中雖聲明是外部變量,但重新賦值后值發(fā)生了變化,但只在復(fù)合語句中起作用。這里a和c都是外部靜態(tài)變量省略了extern內(nèi)外都有內(nèi)優(yōu)先黃興鼎版權(quán)所有黃興鼎版權(quán)所有案例分析:作用范圍與存儲(chǔ)類別案例分析:作用范圍與存儲(chǔ)類別(cw0903.c)作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別#include void a(void); /*a 函數(shù)原型聲明函數(shù)原型聲明 */void b(void); /*b 函數(shù)原型聲明函數(shù)原型聲明 */void c(void); /*c 函數(shù)原型聲明函數(shù)原型聲明 */int x=1;

20、 /*全局變量定義全局變量定義,可以省去不寫可以省去不寫static */int main() int x=5; /* 在主函數(shù)中局部重新賦值在主函數(shù)中局部重新賦值*/ printf(local x in outer scope of main is %dn, x); int x=7; /*x 變量的新作用變量的新作用(塊塊)范圍范圍 重新賦值重新賦值*/ printf(local x in inner scope of main is %dn,x); /*x變量的新作用變量的新作用(塊塊)范圍結(jié)束范圍結(jié)束,恢復(fù)主函授數(shù)中的恢復(fù)主函授數(shù)中的x值值 */ printf(nlocal x in o

21、uter scope of main is %dn,x);作用范圍與存儲(chǔ)類別作用范圍與存儲(chǔ)類別黃興鼎版權(quán)所有黃興鼎版權(quán)所有案例分析:作用范圍與存儲(chǔ)類別案例分析:作用范圍與存儲(chǔ)類別作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別 a(); b(); c(); a(); b(); c(); printf(local x in main is %dn, x); return 0;void a() int x = 25; /*每次被調(diào)用時(shí)重新賦值每次被調(diào)用時(shí)重新賦值*/ printf(n local x in a is %d after enteringn, x); x+; printf(local x in a

22、 is %d before exitingn, x);順序兩次調(diào)用順序兩次調(diào)用a()、b()、c()函數(shù)。函數(shù)。黃興鼎版權(quán)所有黃興鼎版權(quán)所有案例分析:作用范圍與存儲(chǔ)類別案例分析:作用范圍與存儲(chǔ)類別作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別void b() static int x = 50; /*靜態(tài)變量?jī)H在首次被調(diào)用時(shí)初始化靜態(tài)變量?jī)H在首次被調(diào)用時(shí)初始化1次次*/ printf(n local x in b is %d after enteringn, x); x+; /保持保持x 的值的值 printf(local x in b is %d before exitingn, x);void c(

23、) printf(nglobal x is %d on entering cn, x); x*=10; /x 的原值為全局變量的原值為全局變量x的值的值1, printf(global x is %d on exiting cn, x);黃興鼎版權(quán)所有黃興鼎版權(quán)所有作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別黃興鼎版權(quán)所有黃興鼎版權(quán)所有作用范圍與存儲(chǔ)類別作用范圍與存儲(chǔ)類別作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別案例分析:作用范圍與存儲(chǔ)類別案例分析:作用范圍與存儲(chǔ)類別建議:不必要時(shí)不要使用全局變量,原因如下:建議:不必要時(shí)不要使用全局變量,原因如下: 全局變量在程序的全部執(zhí)行過程中都占用存儲(chǔ)單元,而不是僅在

24、需要全局變量在程序的全部執(zhí)行過程中都占用存儲(chǔ)單元,而不是僅在需要時(shí)才開辟單元。時(shí)才開辟單元。 使用全局變量過多,會(huì)降低程序的清晰性。在各個(gè)函數(shù)執(zhí)行時(shí)都可能使用全局變量過多,會(huì)降低程序的清晰性。在各個(gè)函數(shù)執(zhí)行時(shí)都可能改變外部變量的值,程序容易出錯(cuò)。因此,要限制使用全局變量。改變外部變量的值,程序容易出錯(cuò)。因此,要限制使用全局變量。降低函數(shù)的通用性。因?yàn)楹瘮?shù)在執(zhí)行時(shí)要依賴于其所在的外部變量。如降低函數(shù)的通用性。因?yàn)楹瘮?shù)在執(zhí)行時(shí)要依賴于其所在的外部變量。如果將一個(gè)函數(shù)移到另一個(gè)文件中,還要將有關(guān)的外部變量及其值一起移過果將一個(gè)函數(shù)移到另一個(gè)文件中,還要將有關(guān)的外部變量及其值一起移過去。但若該外部變量

25、與其他文件的變量同名時(shí),就會(huì)出現(xiàn)問題,降低了程去。但若該外部變量與其他文件的變量同名時(shí),就會(huì)出現(xiàn)問題,降低了程序的可靠性和通用性。一般要求把程序中的函數(shù)做成一個(gè)封閉體,除了序的可靠性和通用性。一般要求把程序中的函數(shù)做成一個(gè)封閉體,除了通過通過“實(shí)參實(shí)參形參形參”的渠道與外界發(fā)生聯(lián)系外,沒有其他渠道。的渠道與外界發(fā)生聯(lián)系外,沒有其他渠道。全局變量的定義中可以省去不寫全局變量的定義中可以省去不寫static黃興鼎版權(quán)所有黃興鼎版權(quán)所有在復(fù)合語句中定義的自動(dòng)變量在復(fù)合語句中定義的自動(dòng)變量/*教材書教材書P97例例7-6在復(fù)合語句中定義的自動(dòng)變量在復(fù)合語句中定義的自動(dòng)變量*/#include int

26、main() auto int x,y=1,z=1;printf(n input a number:n);scanf(%d,&x);if (x0)auto int y,z;y=6*x;z=9-x;printf(y=%d z=%dn,y,z);printf(y=%d z=%dn,y,z); return 0;3Y=18 z=6Y=1 z=1自動(dòng)變量離開他的應(yīng)用范圍即自動(dòng)變量離開他的應(yīng)用范圍即失效,各有自己的應(yīng)用范圍。失效,各有自己的應(yīng)用范圍。(p97L7-6)一旦退出復(fù)合語句,復(fù)合語句中的Y,Z值已經(jīng)不復(fù)存在黃興鼎版權(quán)所有黃興鼎版權(quán)所有包含多個(gè)源文件的程序包含多個(gè)源文件的程序包含多個(gè)源文

27、件的程序包含多個(gè)源文件的程序每個(gè)函數(shù)的定義必須在一個(gè)文件內(nèi),不能被分割。每個(gè)函數(shù)的定義必須在一個(gè)文件內(nèi),不能被分割。全局變量可以被同一文件內(nèi)的函數(shù)訪問。全局變量可以被同一文件內(nèi)的函數(shù)訪問。如果需要被其他文件內(nèi)的函數(shù)訪問,則必須在其他文件內(nèi)聲明。如果需要被其他文件內(nèi)的函數(shù)訪問,則必須在其他文件內(nèi)聲明。extern 表示變量表示變量myGlobal是在另一個(gè)文件內(nèi)定義的。是在另一個(gè)文件內(nèi)定義的。一個(gè)文件內(nèi)定義的函數(shù),也可以被其他文件內(nèi)的函數(shù)調(diào)用。一個(gè)文件內(nèi)定義的函數(shù),也可以被其他文件內(nèi)的函數(shù)調(diào)用。在每個(gè)文件內(nèi)加入該函數(shù)的原型(聲明為外部函數(shù))。在每個(gè)文件內(nèi)加入該函數(shù)的原型(聲明為外部函數(shù))。函數(shù)的

28、原型可以不需要函數(shù)的原型可以不需要 extern。作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別int myGlobal;extern int myGlobal;a.cb.c黃興鼎版權(quán)所有黃興鼎版權(quán)所有包含多個(gè)源文件的程序包含多個(gè)源文件的程序包含多個(gè)源文件的程序包含多個(gè)源文件的程序舉例舉例作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別#include int a, b;extern int max(void);int main() scanf(%d%d, &a, &b); printf(“max is %dn, max(); return 0;extern int a, b;int max() r

29、eturn (ab?a:b);AB(Cw0904a.c)(Cw0904b.c)黃興鼎版權(quán)所有黃興鼎版權(quán)所有包含多個(gè)源文件的程序包含多個(gè)源文件的程序包含多個(gè)源文件的程序包含多個(gè)源文件的程序static限制全局變量只能被同一文件內(nèi)的函數(shù)訪問。限制全局變量只能被同一文件內(nèi)的函數(shù)訪問。限制函數(shù)只能被同一文件內(nèi)的函數(shù)調(diào)用。限制函數(shù)只能被同一文件內(nèi)的函數(shù)調(diào)用。作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別static int myGlobal;static void myFunc() 黃興鼎版權(quán)所有黃興鼎版權(quán)所有編譯包含多個(gè)源文件的程序編譯包含多個(gè)源文件的程序編譯包含多個(gè)源文件的程序編譯包含多個(gè)源文件的程序每個(gè)源文

30、件必須被編譯,然后鏈接成一個(gè)可執(zhí)行文件。每個(gè)源文件必須被編譯,然后鏈接成一個(gè)可執(zhí)行文件。如果有一個(gè)文件作了改動(dòng),則必須重新編譯所有相關(guān)的文如果有一個(gè)文件作了改動(dòng),則必須重新編譯所有相關(guān)的文件。件。一般會(huì)提供一般會(huì)提供 make 工具用來管理和編譯多源文件的程序。工具用來管理和編譯多源文件的程序。創(chuàng)建創(chuàng)建 makefile 文件,記錄編譯規(guī)則。文件,記錄編譯規(guī)則。自動(dòng)查找必須編譯的源文件。自動(dòng)查找必須編譯的源文件??梢詣?chuàng)建可以創(chuàng)建工程工程(project)文件來管理多源文件的程序。文件來管理多源文件的程序。作用范圍和存儲(chǔ)類別作用范圍和存儲(chǔ)類別黃興鼎版權(quán)所有黃興鼎版權(quán)所有/ /* * cw0905

31、a.c cw0905a.c(文件)(文件)* */ /#include#include stdio.h intint main() main() /*以下以下3行聲明在本函數(shù)中將要調(diào)用的在其他文件中定義的行聲明在本函數(shù)中將要調(diào)用的在其他文件中定義的3個(gè)函數(shù)個(gè)函數(shù)*/ externextern voidvoid enter_string(char str enter_string(char str); ); externextern voidvoid delete_string(char str,char ch delete_string(char str,char ch);); extern

32、voidextern void print_string(char str print_string(char str);); charchar c; c; charchar str80; str80; enter_string(str enter_string(str);); printf printf(輸入要?jiǎng)h除的字符輸入要?jiǎng)h除的字符 ); ); scanf(%c,&c scanf(%c,&c); ); delete_string(str,c delete_string(str,c);); print_string(str print_string(str);); retu

33、rnreturn 0; 例例 有一個(gè)若干字符的字符串有一個(gè)若干字符的字符串,今輸入一個(gè)字符今輸入一個(gè)字符,要求程要求程序?qū)⒆址性撟址麆h去。用外部函數(shù)實(shí)現(xiàn)。序?qū)⒆址性撟址麆h去。用外部函數(shù)實(shí)現(xiàn)。黃興鼎版權(quán)所有黃興鼎版權(quán)所有/* cw0905b.c(文件輸入字符串)(文件輸入字符串)*/#include void enter_string(char str80) /* 定義外部函數(shù) enter-string*/ gets(str); /*向字符數(shù)組輸入字符串*/ /* cw0905c.c(文件刪除(文件刪除字符串字符串)*/void delete_string(char str,char c

34、h) /定義外部函數(shù)定義外部函數(shù)delete_string int i,j; for(i=j=0;stri!=0;i+) if(stri!=ch) strj+=stri; strj=0;黃興鼎版權(quán)所有黃興鼎版權(quán)所有/* cw0905d.c(文件輸出(文件輸出字符串字符串)*/#include void print_string(char str) printf(%sn,str); 運(yùn)行情況如下:運(yùn)行情況如下: (輸入字符串)輸入字符串) (輸入要?jiǎng)h去的字符)(輸入要?jiǎng)h去的字符) (輸出已刪去指定字符的字符串)(輸出已刪去指定字符的字符串)黃興鼎版權(quán)所有黃興鼎版權(quán)所有內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和

35、外部函數(shù) 根據(jù)函數(shù)能否被其他源文件調(diào)用,將函數(shù)區(qū)分為內(nèi)部函數(shù)內(nèi)部函數(shù)和外部函數(shù)外部函數(shù)。如果一個(gè)函數(shù)只能被本文件中其他函數(shù)所調(diào)用,它稱為內(nèi)部函數(shù)。在定義內(nèi)部函數(shù)時(shí),在函數(shù)名和函數(shù)類型的前面加static。即static 類型標(biāo)識(shí)符 函數(shù)名(形參表)例如例如: : static int fun ( int a , int b )1. 定義函數(shù)時(shí),如果在函數(shù)首部的最左端加關(guān)鍵字extern,則表示此函數(shù)是外部函數(shù),可供其他文件調(diào)用。例如,函數(shù)首部可以寫為extern int fun (int a, int b),這樣,函數(shù)fun就可以為其他文件調(diào)用。而且可以省略extern,則隱含為外部函數(shù)。2.

36、 在需要調(diào)用此函數(shù)的文件中,用extern對(duì)函數(shù)作聲明,表示該函數(shù)是在其他文件中定義的外部函數(shù) 。黃興鼎版權(quán)所有黃興鼎版權(quán)所有register::雖然寄存器的速度非常快,但是使用雖然寄存器的速度非常快,但是使用register修修飾符也有些限制:飾符也有些限制:register變量必須是能被變量必須是能被CPU寄存器所接寄存器所接受的類型。意味著受的類型。意味著register變量必須是單個(gè)的值,并且其長(zhǎng)變量必須是單個(gè)的值,并且其長(zhǎng)度應(yīng)小于或等于基本整型的長(zhǎng)度度應(yīng)小于或等于基本整型的長(zhǎng)度;而且而且register變量可能不存放在內(nèi)存中,所以不能用取址運(yùn)變量可能不存放在內(nèi)存中,所以不能用取址運(yùn)算

37、符算符“&”來獲取來獲取register變量的地址。變量的地址。static:主要有兩個(gè)作用:主要有兩個(gè)作用:1、修飾變量。由于被、修飾變量。由于被static修飾的變量總是存在內(nèi)存的靜態(tài)修飾的變量總是存在內(nèi)存的靜態(tài)區(qū),所以即使這個(gè)函數(shù)運(yùn)行結(jié)束,這個(gè)靜態(tài)變量的值還是不區(qū),所以即使這個(gè)函數(shù)運(yùn)行結(jié)束,這個(gè)靜態(tài)變量的值還是不會(huì)被銷毀,函數(shù)下次使用時(shí)仍然能用到這個(gè)值。會(huì)被銷毀,函數(shù)下次使用時(shí)仍然能用到這個(gè)值。2、修飾函數(shù)。函數(shù)前加、修飾函數(shù)。函數(shù)前加static使得函數(shù)成為靜態(tài)函數(shù)。但此使得函數(shù)成為靜態(tài)函數(shù)。但此處處“static”的含義不是指存儲(chǔ)方式,而是指對(duì)函數(shù)的作用域的含義不是指存儲(chǔ)方式

38、,而是指對(duì)函數(shù)的作用域僅局限于本文件僅局限于本文件(所以又稱內(nèi)部函數(shù)所以又稱內(nèi)部函數(shù))。使用內(nèi)部函數(shù)的好處。使用內(nèi)部函數(shù)的好處是:不同的人編寫不同的函數(shù)時(shí),不用擔(dān)心自己定義的函數(shù),是:不同的人編寫不同的函數(shù)時(shí),不用擔(dān)心自己定義的函數(shù),是否會(huì)與其它文件中的函數(shù)同名。是否會(huì)與其它文件中的函數(shù)同名。小結(jié)小結(jié)黃興鼎版權(quán)所有黃興鼎版權(quán)所有1只有局部自動(dòng)變量和形式參數(shù)可以作為寄存器變量只有局部自動(dòng)變量和形式參數(shù)可以作為寄存器變量。 其它(如全局變量)不行。在調(diào)用一個(gè)函數(shù)時(shí)占用一些寄存器以存放寄存器變量的值,函數(shù)調(diào)用結(jié)束釋放寄存器。此后,在調(diào)用另一個(gè)函數(shù)時(shí)又可以利用它來存放該函數(shù)的寄存器變量。2 2一個(gè)計(jì)算

39、機(jī)系統(tǒng)中的寄存器數(shù)目是有限的一個(gè)計(jì)算機(jī)系統(tǒng)中的寄存器數(shù)目是有限的。 不能定義任意多個(gè)寄存器變量。不同的系統(tǒng)允許使用的寄存器個(gè)數(shù)不同。有的小型機(jī)只允許使用3個(gè)寄存器來容納寄存器變量。有些能進(jìn)行優(yōu)化的編譯系統(tǒng),能自動(dòng)識(shí)別使用頻繁的變量,在有可使用寄存器的情況下自動(dòng)為它們分配寄存器,而不需要程序員指定。3 3不同的系統(tǒng)對(duì)不同的系統(tǒng)對(duì)registerregister變量的處理是不同的變量的處理是不同的。 微機(jī)上用的MS C、Turbo C對(duì)register變量當(dāng)作自動(dòng)變量處理,分配內(nèi)存單元,并不真正把它們存放在寄存器中,因此,雖然程序合法,但并不提高執(zhí)行速度。計(jì)算機(jī)只允許將int,char和指針型變量

40、定義為寄存器變量。4 4局部靜態(tài)變量不能定義為寄存器變量。局部靜態(tài)變量不能定義為寄存器變量。 不能寫成: register static int a,b,c; 不能把變量a,b,c既放在靜態(tài)存儲(chǔ)區(qū)中,又放在寄存器中,二者必居其一。5 5通用寄存器的長(zhǎng)度一般與機(jī)器的字長(zhǎng)相同,通用寄存器的長(zhǎng)度一般與機(jī)器的字長(zhǎng)相同, 所以數(shù)據(jù)類型為float、long以及double的變量,通常不能定義為寄存器類別。只有只有intint、shortshort和和charchar類型的變量才準(zhǔn)許定義為寄存器變量類別。類型的變量才準(zhǔn)許定義為寄存器變量類別。說明:說明:黃興鼎版權(quán)所有黃興鼎版權(quán)所有1從作用域角度分,有局部變量和全局變量。它們采取的存儲(chǔ)類別如下:從作用域角度分,有局部變量和全局變量。它們采取的存儲(chǔ)類別如下:局部變量局部變量自動(dòng)變量,即動(dòng)態(tài)局部變量(離開函數(shù),值就消失)自動(dòng)變量,即動(dòng)態(tài)局部變量(離開函數(shù),值就消失)靜態(tài)局部變量(離開函數(shù),值仍保留)靜態(tài)局部變量(離開函數(shù),值仍保留) 寄存器變量(離開函數(shù),值就消失)寄存器變量(離開函數(shù),值就消失)形式參數(shù)可以定義為自動(dòng)變量或寄存器變

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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)論