




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、黃興鼎版權(quán)所有黃興鼎版權(quán)所有C程序源程序文件1源程序文件2源程序文件n預(yù)處理命令函數(shù)n函數(shù)1數(shù)據(jù)聲明函數(shù)首部函數(shù)體數(shù)據(jù)定義聲明執(zhí)行語句C語言函數(shù) 一個一個c程序可以有若干個源程序文件組成程序可以有若干個源程序文件組成一個源文件可以有若干個函數(shù)一個源文件可以有若干個函數(shù)和預(yù)處理命令以及全局變量聲和預(yù)處理命令以及全局變量聲明部分組成明部分組成一個函數(shù)有函數(shù)首部和函數(shù)體組成一個函數(shù)有函數(shù)首部和函數(shù)體組成函數(shù)體由數(shù)據(jù)定義聲明和執(zhí)行語句組成函數(shù)體由數(shù)據(jù)定義聲明和執(zhí)行語句組成黃興鼎版權(quán)所有黃興鼎版權(quán)所有C語言的函數(shù)在在C語言中,函數(shù)語言中,函數(shù)(function)是構(gòu)成程序的基本模塊。是構(gòu)成程序的基本模塊
2、。一個一個C程序由一個或多個函數(shù)組成,有且僅有一個主函數(shù),即程序由一個或多個函數(shù)組成,有且僅有一個主函數(shù),即main()函數(shù)。函數(shù)。每個函數(shù)完成一個相對獨(dú)立且功能明確的任務(wù)。每個函數(shù)完成一個相對獨(dú)立且功能明確的任務(wù)。由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次。同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次。函數(shù)函數(shù)mainfun_afun_bfun_cfun_cfun_dfun_efun_ffun_d黃興鼎版權(quán)所有黃興鼎版權(quán)所有函數(shù)的定義:類型函數(shù)的定義:類型 函數(shù)名(參數(shù)表)函數(shù)名(參數(shù)表)函數(shù)的類型:有
3、參與無參、空函數(shù)、庫函數(shù)。函數(shù)的類型:有參與無參、空函數(shù)、庫函數(shù)。函數(shù)的調(diào)用要合法,原函數(shù)聲明。函數(shù)的調(diào)用要合法,原函數(shù)聲明。參數(shù)傳遞方式:值傳遞和引用傳遞(地址傳遞)。參數(shù)傳遞方式:值傳遞和引用傳遞(地址傳遞)。函數(shù)的返回方式:函數(shù)的返回方式: return; return(表達(dá)式)(表達(dá)式)函數(shù)的參數(shù):實(shí)參與形參,可同名,各有自己的適用范圍。函數(shù)的參數(shù):實(shí)參與形參,可同名,各有自己的適用范圍。1. 1.主函數(shù)中定義的變量只在主函數(shù)中有效主函數(shù)中定義的變量只在主函數(shù)中有效, ,而不因?yàn)樵谥骱瘮?shù)中而不因?yàn)樵谥骱瘮?shù)中定義而在整個文件或程序中有效。主函數(shù)也不能使用其他函定義而在整個文件或程序中有效
4、。主函數(shù)也不能使用其他函數(shù)中定義的變量。數(shù)中定義的變量。2. 2. 不同函數(shù)中可以使用相同名字的變量不同函數(shù)中可以使用相同名字的變量, ,它們代表不同的對象它們代表不同的對象, ,互不干擾?;ゲ桓蓴_。3. 3. 形式參數(shù)也是局部變量。形式參數(shù)也是局部變量。4. 4. 在一個函數(shù)內(nèi)部在一個函數(shù)內(nèi)部, ,可以在復(fù)合語句中定義變量可以在復(fù)合語句中定義變量, ,這些變量只在這些變量只在本復(fù)合語句中有效本復(fù)合語句中有效, ,這種復(fù)合語句也稱為這種復(fù)合語句也稱為“分程序分程序”或或“程序程序塊塊”。C C語言程序設(shè)計教程語言程序設(shè)計教程編寫組編寫組20072007年年1 1月月黃興鼎版權(quán)所有黃興鼎版權(quán)所有
5、作用范圍作用范圍存儲類別存儲類別包含多個源文件的程序包含多個源文件的程序黃興鼎版權(quán)所有黃興鼎版權(quán)所有標(biāo)識符的作用域例標(biāo)識符的作用域例/* cw0900.c標(biāo)識符的作用域例標(biāo)識符的作用域例*/#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,但他們的作用范圍不同但他們的作用范圍不同, ,所以所以不會互相影響。不會互相影響。在討論函數(shù)的形參變量時曾說:形
6、參在討論函數(shù)的形參變量時曾說:形參只在被調(diào)用時才分配內(nèi)存單元,調(diào)用只在被調(diào)用時才分配內(nèi)存單元,調(diào)用結(jié)束立即釋放??梢娦螀⒅挥性谠摵Y(jié)束立即釋放??梢娦螀⒅挥性谠摵瘮?shù)內(nèi)才是有效的,離開該函數(shù)就不能數(shù)內(nèi)才是有效的,離開該函數(shù)就不能再使用了。這種變量的有效性的范圍,再使用了。這種變量的有效性的范圍,稱為變量的作用域。稱為變量的作用域。黃興鼎版權(quán)所有黃興鼎版權(quán)所有不僅形參變量,不僅形參變量,C語言中所有的語言中所有的量量都有自己的作用域。都有自己的作用域。這些量都是用標(biāo)識符來說明的,所以又稱為這些量都是用標(biāo)識符來說明的,所以又稱為標(biāo)識符的作用標(biāo)識符的作用域。域。標(biāo)識符包括變量名、函數(shù)名等,標(biāo)識符包括變
7、量名、函數(shù)名等,作用域就是指在程序作用域就是指在程序中可以被使用的范圍。中可以被使用的范圍。在C語言中可以在函數(shù)內(nèi)部、外部和函數(shù)的參數(shù)中定義和聲明變量,定義和聲明的位置不同定義和聲明的位置不同,變量的作用域不同變量的作用域不同,變量的作用域也稱為可見性可見性。變量的聲明方式不同,其作用域也不同。C語言中的變量,按作用域范圍可分為兩種,即局部變量局部變量和全局變量全局變量。黃興鼎版權(quán)所有黃興鼎版權(quán)所有簡介簡介變量定義的完整格式:變量定義的完整格式: 數(shù)據(jù)類型數(shù)據(jù)類型占據(jù)存儲空間的大小占據(jù)存儲空間的大小-字節(jié)數(shù)字節(jié)數(shù)取值范圍取值范圍-有效數(shù)字有效數(shù)字存儲類別存儲類別在內(nèi)存中持續(xù)的時間(生存期)在內(nèi)
8、存中持續(xù)的時間(生存期)在硬件中存放的位置在硬件中存放的位置其它屬性其它屬性作用范圍作用范圍 可以被引用的程序部分(可見性)可以被引用的程序部分(可見性)作用范圍和存儲類別作用范圍和存儲類別前面幾章中,我們已經(jīng)知前面幾章中,我們已經(jīng)知道變量的數(shù)據(jù)類型和變量道變量的數(shù)據(jù)類型和變量名的有關(guān)規(guī)定,這一章主名的有關(guān)規(guī)定,這一章主要介紹存儲類別。要介紹存儲類別。黃興鼎版權(quán)所有黃興鼎版權(quán)所有作用范圍作用范圍標(biāo)識符的作用范圍標(biāo)識符的作用范圍能夠引用該標(biāo)識符的程序部分。能夠引用該標(biāo)識符的程序部分。四種作用范圍:四種作用范圍: 文件作用范圍文件作用范圍 函數(shù)作用范圍函數(shù)作用范圍 程序塊作用范圍程序塊作用范圍 函
9、數(shù)原型作用范圍函數(shù)原型作用范圍作用范圍和存儲類別作用范圍和存儲類別文件作用范圍文件作用范圍在函數(shù)外聲明的標(biāo)識符,可以在在函數(shù)外聲明的標(biāo)識符,可以在從聲明處開始的從聲明處開始的所有函數(shù)所有函數(shù)中被引用。中被引用。包括:全局變量,函數(shù)定義,函數(shù)原型。包括:全局變量,函數(shù)定義,函數(shù)原型。黃興鼎版權(quán)所有黃興鼎版權(quán)所有全局變量舉例全局變量舉例(cw0901.c)作為研究題作為研究題int a=3, b=5, x, y; /* 全局變量 */int max(int x, int y) int c; /* extern 不加這一行,則下一行輸出是錯誤碼的。*/ printf(“c=%dn”,c); retu
10、rn xy?x:y;int c=4; /* 全局變量 */int main() int a=8; printf(在主函數(shù)中在主函數(shù)中c=%dn,c); c=max(a, b); printf(“max=%dn”,c); return 0;全局變量全局變量a,b,x,y作用域作用域局部變量局部變量a作用域作用域形參形參x,y作用域作用域作用范圍作用范圍全局變量全局變量c作用域作用域c=4c=-858993460max=8黃興鼎版權(quán)所有黃興鼎版權(quán)所有作用范圍作用范圍函數(shù)作用范圍函數(shù)作用范圍在函數(shù)體內(nèi)定義的標(biāo)識符,只能在函數(shù)體內(nèi)被引用。在函數(shù)體內(nèi)定義的標(biāo)識符,只能在函數(shù)體內(nèi)被引用。包括:包括:語句標(biāo)
11、號語句標(biāo)號作用范圍和存儲類別作用范圍和存儲類別int main() int x; char c; loop: goto loop;內(nèi)部變量:內(nèi)部變量:在一個函數(shù)內(nèi)部定義的變在一個函數(shù)內(nèi)部定義的變量稱內(nèi)部變量。它只在本函數(shù)范圍內(nèi)量稱內(nèi)部變量。它只在本函數(shù)范圍內(nèi)有效,即:只有在本函數(shù)內(nèi)才能使用有效,即:只有在本函數(shù)內(nèi)才能使用這些變量,故稱為這些變量,故稱為“局部變量局部變量” 。對于變量本身來說,我們覺得采用內(nèi)部變量和外部變量的稱謂簡單易懂,對于變量本身來說,我們覺得采用內(nèi)部變量和外部變量的稱謂簡單易懂,更反映了事物的本質(zhì),也便于學(xué)習(xí)者記憶。更反映了事物的本質(zhì),也便于學(xué)習(xí)者記憶。外部變量具有全局屬
12、性外部變量具有全局屬性( 全局作用域全局作用域),內(nèi)部變量具有局部屬性,內(nèi)部變量具有局部屬性( 局部作用局部作用域域)的說法更為準(zhǔn)確。的說法更為準(zhǔn)確。 外部變量對應(yīng)外部變量對應(yīng)“全局變量全局變量”,內(nèi)部變量對應(yīng)內(nèi)部變量對應(yīng)“局部變量局部變量”。黃興鼎版權(quán)所有黃興鼎版權(quán)所有作用范圍作用范圍程序塊作用范圍程序塊作用范圍在程序塊內(nèi)聲明的變量,在程序塊內(nèi)被引用。在程序塊內(nèi)聲明的變量,在程序塊內(nèi)被引用。包括:程序塊內(nèi)的變量(局部變量),函數(shù)的參數(shù)。包括:程序塊內(nèi)的變量(局部變量),函數(shù)的參數(shù)。作用范圍和存儲類別作用范圍和存儲類別int max(int x, int y) int main() int a
13、=9; int a=6; 作用范圍作用范圍從聲明的位置開始,到從聲明的位置開始,到程序塊的右花括號。程序塊的右花括號。覆蓋覆蓋同名變量,內(nèi)部變量同名變量,內(nèi)部變量“覆蓋了覆蓋了”外部變量外部變量“外部外部”與與“內(nèi)部內(nèi)部”是相對而言的,是相對而言的,其屬性差別主要就源于其定義位置不其屬性差別主要就源于其定義位置不同。同。 黃興鼎版權(quán)所有黃興鼎版權(quán)所有關(guān)于聲明和定義關(guān)于聲明和定義定義定義與與聲明聲明定義一個標(biāo)識符,同時也是聲明定義一個標(biāo)識符,同時也是聲明。但不能說聲明就是定義。但不能說聲明就是定義定義意味著創(chuàng)建,即為其分配內(nèi)存。定義意味著創(chuàng)建,即為其分配內(nèi)存。聲明變量只是說明要引用某處的變量,變
14、量名已經(jīng)預(yù)定聲明變量只是說明要引用某處的變量,變量名已經(jīng)預(yù)定聲明函數(shù)說明已經(jīng)定義了函數(shù),可以調(diào)用。聲明函數(shù)說明已經(jīng)定義了函數(shù),可以調(diào)用。引用聲明引用聲明只是聲明一個需要引用的標(biāo)識符。只是聲明一個需要引用的標(biāo)識符。作用范圍和存儲類別作用范圍和存儲類別黃興鼎版權(quán)所有黃興鼎版權(quán)所有存儲類別存儲類別四種存儲類別說明符四種存儲類別說明符autoregisterexternstatic兩種存儲時期兩種存儲時期自動存儲時期自動存儲時期autoregister靜態(tài)存儲時期靜態(tài)存儲時期externstatic作用范圍和存儲類別作用范圍和存儲類別自動存儲類別自動存儲類別寄存器變量寄存器變量外部變量外部變量靜態(tài)變量
15、靜態(tài)變量和函數(shù)和函數(shù)函數(shù)中的局部變量,如不專門函數(shù)中的局部變量,如不專門說明為靜態(tài)存儲類別說明為靜態(tài)存儲類別, ,都是動態(tài)都是動態(tài)分配存儲空間的分配存儲空間的, ,存儲在動態(tài)存存儲在動態(tài)存儲區(qū)中。對它們分配和釋放存儲儲區(qū)中。對它們分配和釋放存儲空間的工作由編譯系統(tǒng)自動處理,空間的工作由編譯系統(tǒng)自動處理,因此這類局部變量稱為自動變量因此這類局部變量稱為自動變量。自動變量用關(guān)鍵字自動變量用關(guān)鍵字autoauto作存儲類作存儲類型的說明。型的說明。函數(shù)形參為局部變量,函數(shù)形參為局部變量,也為自動變量。自動變量存放在也為自動變量。自動變量存放在運(yùn)行棧區(qū)。運(yùn)行棧區(qū)。C C語言規(guī)定語言規(guī)定autoauto
16、通常在局部變通常在局部變量的定義中可以省去不寫。量的定義中可以省去不寫。但不能說省去不寫的變量就是但不能說省去不寫的變量就是自動變量,因?yàn)樽詣幼兞?,因?yàn)槿肿兞渴庆o態(tài)全局變量是靜態(tài)變量,也可以省去不寫變量,也可以省去不寫。黃興鼎版權(quán)所有黃興鼎版權(quán)所有自動存儲類別自動存儲類別自動存儲自動存儲程序執(zhí)行到變量所在的程序塊內(nèi)時創(chuàng)建它,退出時銷毀。程序執(zhí)行到變量所在的程序塊內(nèi)時創(chuàng)建它,退出時銷毀。不會被自動初始化。不會被自動初始化。auto(自動變量)(自動變量):局部變量的缺省類別。:局部變量的缺省類別。不賦初值,其值不確定。不賦初值,其值不確定。程序塊中聲明的變量,函數(shù)的參數(shù)。程序塊中聲明的變量,函
17、數(shù)的參數(shù)。作用范圍和存儲類別作用范圍和存儲類別auto int a, b;register int count=1;使用頻繁的變量,存取其值要花費(fèi)不少時間。為提高執(zhí)行效率,語言允使用頻繁的變量,存取其值要花費(fèi)不少時間。為提高執(zhí)行效率,語言允許將局部變量動態(tài)的值放在寄存器中,需要用時直接從寄存器取出參加運(yùn)許將局部變量動態(tài)的值放在寄存器中,需要用時直接從寄存器取出參加運(yùn)算,不必再到內(nèi)存中去存取。由于對寄存器的存取速度遠(yuǎn)高于對內(nèi)存的存算,不必再到內(nèi)存中去存取。由于對寄存器的存取速度遠(yuǎn)高于對內(nèi)存的存取速度,因此這樣做可以提高執(zhí)行效率。這種變量叫做寄存器變量。取速度,因此這樣做可以提高執(zhí)行效率。這種變量
18、叫做寄存器變量。register(寄存器變量)(寄存器變量):建議編譯器把變量放進(jìn)高速的寄:建議編譯器把變量放進(jìn)高速的寄存器。存器。只適用于自動變量只適用于自動變量。黃興鼎版權(quán)所有黃興鼎版權(quán)所有靜態(tài)存儲類別靜態(tài)存儲類別靜態(tài)存儲靜態(tài)存儲程序開始執(zhí)行時創(chuàng)建,在程序執(zhí)行期間,變量一直存在。程序開始執(zhí)行時創(chuàng)建,在程序執(zhí)行期間,變量一直存在。在編譯時賦初值,在編譯時賦初值,缺省初值缺省初值時時自動被初始化自動被初始化為為0 或或 0。static(靜態(tài)變量)(靜態(tài)變量):可以用于在程序塊中定義的變量。:可以用于在程序塊中定義的變量。退出程序塊后依然存在,并保留值。退出程序塊后依然存在,并保留值。但不改變
19、其作用范圍,即只能在所在程序塊內(nèi)被使用。但不改變其作用范圍,即只能在所在程序塊內(nèi)被使用。extern(外部變量)(外部變量):用來聲明在:用來聲明在“外部外部”定義的全局變量。定義的全局變量。僅用于聲明變量。僅用于聲明變量。作用范圍和存儲類別作用范圍和存儲類別static int a, b;extern int total;外部變量:外部變量:函數(shù)之外定義的變量稱為外部變函數(shù)之外定義的變量稱為外部變量。外部變量可以為本文件中其他函數(shù)所共用。量。外部變量可以為本文件中其他函數(shù)所共用。它的有效范圍為從聲明變量的位置開始到本源它的有效范圍為從聲明變量的位置開始到本源文件結(jié)束。所以也稱全局變量。文件結(jié)
20、束。所以也稱全局變量。注意區(qū)別:注意區(qū)別:0數(shù)字、數(shù)字、0和和0字字符符黃興鼎版權(quán)所有黃興鼎版權(quán)所有案例分析:存儲類別案例分析:存儲類別存儲類別存儲類別作用范圍和存儲類別作用范圍和存儲類別void try(int a) auto int b=10; /*b是動態(tài)變量,是動態(tài)變量,auto可省可省,每次調(diào)用被重新賦值。每次調(diào)用被重新賦值。*/ static int c=10; /*c是靜態(tài)變量,在是靜態(tài)變量,在try函數(shù)中保持上次運(yùn)算結(jié)果不變函數(shù)中保持上次運(yùn)算結(jié)果不變*/ b+; c+; printf(a=%dtb=%dtc=%dn,a,b,c);int main() int I,a; / i是
21、是 Auto被省略了被省略了 /*上面上面a 定義為自動變量定義為自動變量,則輸出一個隨機(jī)數(shù)則輸出一個隨機(jī)數(shù),而不是而不是0, 如果如果a 是一個字符變量是一個字符變量,則輸出一個隨機(jī)字符。則輸出一個隨機(jī)字符。*/ static int c; for (i=1;i=3;i+)try(i); /*c是靜態(tài)變量是靜態(tài)變量,并未賦值。所以為并未賦值。所以為0,如果如果c是字符變量是字符變量,則輸出為空格則輸出為空格*/ printf(“a=%d tc=%d,a,c); return 0;讀下面的程序,寫出結(jié)果。讀下面的程序,寫出結(jié)果。(cw0902.c)a=1 b=11 c=11a=2 b=11 c
22、=12a=3 b=11 c=13a=? c=0黃興鼎版權(quán)所有黃興鼎版權(quán)所有案例分析:外部變量案例分析:外部變量外部變量外部變量(cw0903.c)作用范圍和存儲類別作用范圍和存儲類別#include int main() extern int a; int c=3; printf(a=%dn,a); extern int c; printf(inner c=%dn, c); printf(c=%dn, c); return 0;int a=1;int c=5;a=1inner c=5c=3a是外部變量,在所有區(qū)域都為1,c在主函數(shù)中保持不變,在復(fù)合語句中雖聲明是外部變量,但重新賦值后值發(fā)生了變
23、化,但只在復(fù)合語句中起作用。內(nèi)外都有內(nèi)優(yōu)先全局變量一般放在文件的開始處。如放在其他地方則使用時要聲明為全局變量一般放在文件的開始處。如放在其他地方則使用時要聲明為extern注意:不加這extern下一行的輸出不確定黃興鼎版權(quán)所有黃興鼎版權(quán)所有/* CW0903-b.c 外部變量外部變量*/#include int a=1; /一般定義全局變量應(yīng)當(dāng)在文件開始一般定義全局變量應(yīng)當(dāng)在文件開始.int c=5;void main() int c=3; printf(“a = %dn”, a); /這里這里a不用聲明為不用聲明為extern也可使用,因在后也可使用,因在后 /*這里聲明為外部的,只在塊
24、中有效這里聲明為外部的,只在塊中有效,如果不加如果不加extern下面的輸出仍為下面的輸出仍為3*/ extern int c; /這里這里c不聲明容易混不聲明容易混 printf(inner c = %dn, c); printf(c = %dn, c); /這里這里c 是主函數(shù)中的是主函數(shù)中的c=3正因?yàn)橛羞@些問題,所以盡量少用全局變量。黃興鼎版權(quán)所有黃興鼎版權(quán)所有案例分析:作用范圍與存儲類別案例分析:作用范圍與存儲類別(cw0904.c)作用范圍和存儲類別作用范圍和存儲類別#include void a(void); /*a 函數(shù)原型聲明函數(shù)原型聲明 */void b(void); /*
25、b 函數(shù)原型聲明函數(shù)原型聲明 */void c(void); /*c 函數(shù)原型聲明函數(shù)原型聲明 */int x=1; /*全局變量定義全局變量定義,可以省去不寫可以省去不寫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變量的新作用變量的新
26、作用(塊塊)范圍結(jié)束范圍結(jié)束,恢復(fù)主函授數(shù)中的恢復(fù)主函授數(shù)中的x值值 */ printf(nlocal x in outer scope of main is %dn,x);作用范圍與存儲類別作用范圍與存儲類別黃興鼎版權(quán)所有黃興鼎版權(quán)所有案例分析:作用范圍與存儲類別案例分析:作用范圍與存儲類別作用范圍和存儲類別作用范圍和存儲類別 a(); b(); c(); a(); b(); c(); printf(local x in main is %dn, x); return 0;void a() int x = 25; /*每次被調(diào)用時重新賦值每次被調(diào)用時重新賦值*/ printf(n local
27、 x in a is %d after enteringn, x); x+; printf(local x in a is %d before exitingn, x);順序兩次調(diào)用順序兩次調(diào)用a()、b()、c()函數(shù)。函數(shù)。黃興鼎版權(quán)所有黃興鼎版權(quán)所有案例分析:作用范圍與存儲類別案例分析:作用范圍與存儲類別作用范圍和存儲類別作用范圍和存儲類別void b() static int x = 50; /*靜態(tài)變量僅在首次被調(diào)用時初始化靜態(tài)變量僅在首次被調(diào)用時初始化1次次*/ printf(n local x in b is %d after enteringn, x); x+; /保持保持x
28、的值的值 printf(local x in b is %d before exitingn, x);void c() 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)所有作用范圍和存儲類別作用范圍和存儲類別靜態(tài)變量的值在函數(shù)中保持上次運(yùn)行值不變,但作用范圍不變。靜態(tài)變量的值在函數(shù)中保持上次運(yùn)行值不變,但作用范圍不變。若全局變量與局部變量重名,則局部變量在作用域內(nèi)屏蔽全局變量若全局變量與
29、局部變量重名,則局部變量在作用域內(nèi)屏蔽全局變量黃興鼎版權(quán)所有黃興鼎版權(quán)所有作用范圍與存儲類別作用范圍與存儲類別作用范圍和存儲類別作用范圍和存儲類別案例分析:作用范圍與存儲類別案例分析:作用范圍與存儲類別建議:不必要時不要使用全局變量,原因如下:建議:不必要時不要使用全局變量,原因如下: 全局變量在程序的全部執(zhí)行過程中都占用存儲單元,而不是僅在需要全局變量在程序的全部執(zhí)行過程中都占用存儲單元,而不是僅在需要時才開辟內(nèi)存單元。時才開辟內(nèi)存單元。 使用全局變量過多,會降低程序的清晰性。在各個函數(shù)執(zhí)行時都可能使用全局變量過多,會降低程序的清晰性。在各個函數(shù)執(zhí)行時都可能改變外部變量的值,程序容易出錯。因
30、此,要限制使用全局變量。改變外部變量的值,程序容易出錯。因此,要限制使用全局變量。降低函數(shù)的通用性。因?yàn)楹瘮?shù)在執(zhí)行時要依賴于其所在的外部變量。如降低函數(shù)的通用性。因?yàn)楹瘮?shù)在執(zhí)行時要依賴于其所在的外部變量。如果將一個函數(shù)移到另一個文件中,還要將有關(guān)的外部變量及其值一起移過果將一個函數(shù)移到另一個文件中,還要將有關(guān)的外部變量及其值一起移過去。但若該外部變量與其他文件的變量同名時,就會出現(xiàn)問題,降低了程去。但若該外部變量與其他文件的變量同名時,就會出現(xiàn)問題,降低了程序的可靠性和通用性。一般要求把程序中的函數(shù)做成一個封閉體,除了序的可靠性和通用性。一般要求把程序中的函數(shù)做成一個封閉體,除了通過通過“實(shí)參
31、實(shí)參形參形參”的渠道與外界發(fā)生聯(lián)系外,沒有其他渠道。的渠道與外界發(fā)生聯(lián)系外,沒有其他渠道。全局變量的定義中可以省去不寫全局變量的定義中可以省去不寫static黃興鼎版權(quán)所有黃興鼎版權(quán)所有在復(fù)合語句中定義的自動變量在復(fù)合語句中定義的自動變量/*教材書教材書P97例例7-6在復(fù)合語句中定義的自動變量在復(fù)合語句中定義的自動變量*/#include int 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)
32、;printf(y=%d z=%dn,y,z); return 0;3Y=18 z=6Y=1 z=1自動變量離開他的應(yīng)用范圍即自動變量離開他的應(yīng)用范圍即失效,各有自己的應(yīng)用范圍。失效,各有自己的應(yīng)用范圍。(p97L7-6)一旦退出復(fù)合語句,復(fù)合語句中的Y,Z值已經(jīng)不復(fù)存在黃興鼎版權(quán)所有黃興鼎版權(quán)所有包含多個源文件的程序包含多個源文件的程序包含多個源文件的程序包含多個源文件的程序每個函數(shù)的定義必須在一個文件內(nèi),不能被分割。每個函數(shù)的定義必須在一個文件內(nèi),不能被分割。全局變量可以被同一文件內(nèi)的函數(shù)訪問。全局變量可以被同一文件內(nèi)的函數(shù)訪問。如果需要被其他文件內(nèi)的函數(shù)訪問,則必須在其他文件內(nèi)聲明。如果
33、需要被其他文件內(nèi)的函數(shù)訪問,則必須在其他文件內(nèi)聲明。extern 表示變量表示變量myGlobal是在另一個文件內(nèi)定義的。是在另一個文件內(nèi)定義的。一個文件內(nèi)定義的函數(shù),也可以被其他文件內(nèi)的函數(shù)調(diào)用。一個文件內(nèi)定義的函數(shù),也可以被其他文件內(nèi)的函數(shù)調(diào)用。在每個文件內(nèi)加入該函數(shù)的原型(聲明為外部函數(shù))。在每個文件內(nèi)加入該函數(shù)的原型(聲明為外部函數(shù))。函數(shù)的原型可以不需要函數(shù)的原型可以不需要 extern。作用范圍和存儲類別作用范圍和存儲類別int myGlobal;extern int myGlobal;a.cb.c黃興鼎版權(quán)所有黃興鼎版權(quán)所有包含多個源文件的程序包含多個源文件的程序包含多個源文件的
34、程序包含多個源文件的程序舉例舉例作用范圍和存儲類別作用范圍和存儲類別#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() return (ab?a:b);AB(Cw0905a.c)(Cw0905b.c)黃興鼎版權(quán)所有黃興鼎版權(quán)所有編譯包含多個源文件的程序編譯包含多個源文件的程序編譯包含多個源文件的程序編譯包含多個源文件的程序每個源文件必須被編譯,然后鏈接成一個可執(zhí)行文件
35、。每個源文件必須被編譯,然后鏈接成一個可執(zhí)行文件。如果有一個文件作了改動,則必須重新編譯所有相關(guān)的文件。如果有一個文件作了改動,則必須重新編譯所有相關(guān)的文件。一般會提供一般會提供 make 工具用來管理和編譯多源文件的程序。工具用來管理和編譯多源文件的程序。 創(chuàng)建創(chuàng)建 makefile 文件,記錄編譯規(guī)則。文件,記錄編譯規(guī)則。 自動查找必須編譯的源文件。自動查找必須編譯的源文件。可以創(chuàng)建可以創(chuàng)建工程工程(project)文件來管理多源文件的程序。文件來管理多源文件的程序。作用范圍和存儲類別作用范圍和存儲類別包含多個源文件的程序包含多個源文件的程序static 限制全局變量只能被同一文件內(nèi)的函數(shù)
36、訪問。限制全局變量只能被同一文件內(nèi)的函數(shù)訪問。 限制函數(shù)只能被同一文件內(nèi)的函數(shù)調(diào)用。限制函數(shù)只能被同一文件內(nèi)的函數(shù)調(diào)用。黃興鼎版權(quán)所有黃興鼎版權(quán)所有/ /* * cw0906a.c cw0906a.c(文件)(文件)* */ /#include#include stdio.h intint main() main() /*以下以下3行聲明在本函數(shù)中將要調(diào)用的在其他文件中定義的行聲明在本函數(shù)中將要調(diào)用的在其他文件中定義的3個函數(shù)個函數(shù)*/ externextern voidvoid enter_string(char str enter_string(char str); ); externex
37、tern voidvoid delete_string(char str,char ch delete_string(char str,char ch);); extern voidextern void print_string(char str print_string(char str);); charchar c; c; charchar str80; str80; enter_string(str enter_string(str);); printf printf(輸入要刪除的字符輸入要刪除的字符 ); ); scanf(%c,&c scanf(%c,&c); );
38、 delete_string(str,c delete_string(str,c);); print_string(str print_string(str);); returnreturn 0; 例例 有一個若干字符的字符串有一個若干字符的字符串,今輸入一個字符今輸入一個字符,要求程要求程序?qū)⒆址性撟址麆h去。用外部函數(shù)實(shí)現(xiàn)。序?qū)⒆址性撟址麆h去。用外部函數(shù)實(shí)現(xiàn)。黃興鼎版權(quán)所有黃興鼎版權(quán)所有/* cw0906b.c(文件輸入字符串)(文件輸入字符串)*/#include void enter_string(char str80) /* 定義外部函數(shù) enter-string*/ gets
39、(str); /*向字符數(shù)組輸入字符串*/ /* cw0906c.c(文件刪除(文件刪除字符串字符串)*/void delete_string(char str,char ch) /定義外部函數(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)所有/* cw0906d.c(文件輸出(文件輸出字符串字符串)*/#include void print_string(ch
40、ar str) printf(%sn,str); 運(yùn)行情況如下:運(yùn)行情況如下: (輸入字符串)輸入字符串) (輸入要刪去的字符)(輸入要刪去的字符) (輸出已刪去指定字符的字符串)(輸出已刪去指定字符的字符串)http:/ 根據(jù)函數(shù)能否被其他源文件調(diào)用,將函數(shù)區(qū)分為內(nèi)部函數(shù)內(nèi)部函數(shù)和外部函數(shù)外部函數(shù)。如果一個函數(shù)只能被本文件中其他函數(shù)所調(diào)用,它稱為內(nèi)部函數(shù)。在定義內(nèi)部函數(shù)時,在函數(shù)名和函數(shù)類型的前面加static。即static 類型標(biāo)識符 函數(shù)名(形參表)例如例如: : static int fun ( int a , int b )1. 定義函數(shù)時,如果在函數(shù)首部的最左端加關(guān)鍵字exter
41、n,則表示此函數(shù)是外部函數(shù),可供其他文件調(diào)用。例如,函數(shù)首部可以寫為:extern int fun (int a, int b),這樣,函數(shù)fun就可以為其他文件調(diào)用。而且可以省略extern,則隱含為外部函數(shù)。2. 在需要調(diào)用此函數(shù)的文件中,用extern對函數(shù)作聲明,表示該函數(shù)是在其他文件中定義的外部函數(shù) 。黃興鼎版權(quán)所有黃興鼎版權(quán)所有register::雖然寄存器的速度非??欤鞘褂秒m然寄存器的速度非??欤鞘褂胷egister修修飾符也有些限制:飾符也有些限制:register變量必須是能被變量必須是能被CPU寄存器所接寄存器所接受的類型。意味著受的類型。意味著register變量
42、必須是單個的值,并且其長變量必須是單個的值,并且其長度應(yīng)小于或等于基本整型的長度度應(yīng)小于或等于基本整型的長度;而且而且register變量可能不存放在內(nèi)存中,所以不能用取址運(yùn)變量可能不存放在內(nèi)存中,所以不能用取址運(yùn)算符算符“&”來獲取來獲取register變量的地址。變量的地址。static:主要有兩個作用:主要有兩個作用:1、修飾變量。由于被、修飾變量。由于被static修飾的變量總是存在內(nèi)存的靜態(tài)修飾的變量總是存在內(nèi)存的靜態(tài)區(qū),所以即使這個函數(shù)運(yùn)行結(jié)束,這個靜態(tài)變量的值還是不區(qū),所以即使這個函數(shù)運(yùn)行結(jié)束,這個靜態(tài)變量的值還是不會被銷毀,函數(shù)下次使用時仍然能用到這個值。會被銷毀,函數(shù)
43、下次使用時仍然能用到這個值。2、修飾函數(shù)。函數(shù)前加、修飾函數(shù)。函數(shù)前加static使得函數(shù)成為靜態(tài)函數(shù)。但此使得函數(shù)成為靜態(tài)函數(shù)。但此處處“static”的含義不是指存儲方式,而是指對函數(shù)的作用域的含義不是指存儲方式,而是指對函數(shù)的作用域僅局限于本文件僅局限于本文件(所以又稱內(nèi)部函數(shù)所以又稱內(nèi)部函數(shù))。使用內(nèi)部函數(shù)的好處。使用內(nèi)部函數(shù)的好處是:不同的人編寫不同的函數(shù)時,不用擔(dān)心自己定義的函數(shù),是:不同的人編寫不同的函數(shù)時,不用擔(dān)心自己定義的函數(shù),是否會與其它文件中的函數(shù)同名。是否會與其它文件中的函數(shù)同名。小結(jié)小結(jié)黃興鼎版權(quán)所有黃興鼎版權(quán)所有1只有局部自動變量和形式參數(shù)可以作為寄存器變量只有局部
44、自動變量和形式參數(shù)可以作為寄存器變量。 其它(如全局變量)不行。在調(diào)用一個函數(shù)時占用一些寄存器以存放寄存器變量的值,函數(shù)調(diào)用結(jié)束釋放寄存器。此后,在調(diào)用另一個函數(shù)時又可以利用它來存放該函數(shù)的寄存器變量。2 2一個計算機(jī)系統(tǒng)中的寄存器數(shù)目是有限的一個計算機(jī)系統(tǒng)中的寄存器數(shù)目是有限的。 不能定義任意多個寄存器變量。不同的系統(tǒng)允許使用的寄存器個數(shù)不同。有的小型機(jī)只允許使用3個寄存器來容納寄存器變量。有些能進(jìn)行優(yōu)化的編譯系統(tǒng),能自動識別使用頻繁的變量,在有可使用寄存器的情況下自動為它們分配寄存器,而不需要程序員指定。3 3不同的系統(tǒng)對不同的系統(tǒng)對registerregister變量的處理是不同的變量的
45、處理是不同的。 微機(jī)上用的MS C、Turbo C對register變量當(dāng)作自動變量處理,分配內(nèi)存單元,并不真正把它們存放在寄存器中,因此,雖然程序合法,但并不提高執(zhí)行速度。計算機(jī)只允許將int,char和指針型變量定義為寄存器變量。4 4局部靜態(tài)變量不能定義為寄存器變量。局部靜態(tài)變量不能定義為寄存器變量。 不能寫成: register static int a,b,c; 不能把變量a,b,c既放在靜態(tài)存儲區(qū)中,又放在寄存器中,二者必居其一。5 5通用寄存器的長度一般與機(jī)器的字長相同,通用寄存器的長度一般與機(jī)器的字長相同, 所以數(shù)據(jù)類型為float、long以及double的變量,通常不能定義為寄存器類別。只有只有intint、shortshort和和charchar類型的變量才準(zhǔn)許定義為寄存器變量類別。類型的變量才準(zhǔn)許定義為寄存器變量類別。說明:說明:黃興鼎版權(quán)所有黃興鼎版權(quán)所有1從作用域角度分,有局部變量和全局變量。它們采取的存儲類別如下:從作用域角度分,有
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 湘教版七年級下冊4.1.2相交直線所成的角第1課時教學(xué)設(shè)計及反思
- 27 一個粗瓷大碗 教學(xué)設(shè)計-2024-2025學(xué)年語文三年級上冊統(tǒng)編版001
- 歸去來兮辭文言知識歸納
- 血管通路的選擇與護(hù)理
- 2024年秋新人教PEP版三年級上冊英語教學(xué)課件 Unit 5 Part A 第1課時
- 防積水安全培訓(xùn)
- 采購合同合同管理專業(yè)情報收集重點(diǎn)基礎(chǔ)知識點(diǎn)
- 安全生產(chǎn)事故預(yù)防規(guī)劃師重點(diǎn)基礎(chǔ)知識點(diǎn)
- 安全漏洞修復(fù)風(fēng)險流程重點(diǎn)基礎(chǔ)知識點(diǎn)
- 人力資源管理保密協(xié)議二零二五年
- 2018年浙江省化學(xué)競賽預(yù)賽試題
- 教務(wù)處教學(xué)教案作業(yè)檢查記錄表
- 電梯設(shè)備故障記錄表
- DB50∕T 341-2009 城鄉(xiāng)社區(qū)消防安全管理規(guī)范
- 干粉滅火器點(diǎn)檢記錄表(樣表)
- 伍光和自然地理學(xué)4版知識點(diǎn)總結(jié)課后答案
- 手壓式手電筒設(shè)計(棘輪機(jī)構(gòu)及電路設(shè)計)
- 滇10J6-1住宅廚房、衛(wèi)生間煙氣道及管道井構(gòu)造圖集
- 華中科技大學(xué)版五年級信息技術(shù)教案
- 600MW超臨界鍋爐給水控制系統(tǒng)分析
- 固定收益研究報告透過x系統(tǒng)看銀行間交易未來發(fā)展
評論
0/150
提交評論