版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第四章 函數(shù)西安交通大學(xué)程序設(shè)計(jì)基礎(chǔ)課程組2008本章要點(diǎn)函數(shù)概述函數(shù)定義函數(shù)參數(shù)與函數(shù)的返回值函數(shù)的調(diào)用函數(shù)嵌套調(diào)用和遞歸調(diào)用變量作用域變量存儲(chǔ)類別與生存周期內(nèi)部函數(shù)和外部函數(shù)問題的提出:在實(shí)際應(yīng)用中,需要解決的問題很復(fù)雜或很龐大時(shí),編程怎么實(shí)現(xiàn)?從哪里入手?代碼量太大功能太復(fù)雜一個(gè)人不能勝任用一個(gè)main()實(shí)現(xiàn)需要多長代碼?分而治之(模塊化)模塊化的優(yōu)點(diǎn):模塊各司其職每個(gè)模塊只負(fù)責(zé)一件事情,它可以更專心便于進(jìn)行單個(gè)模塊的設(shè)計(jì)、開發(fā)、調(diào)試、測試和維護(hù)等工作一個(gè)模塊一個(gè)模塊地完成,最后再將它們集成開發(fā)人員各司其職按模塊分配任務(wù),職責(zé)明確并行開發(fā),縮短開發(fā)時(shí)間假如不采用模塊化?main()當(dāng)中
2、能放多少行程序?讀多少行的程序能讓你不頭疼?假如printf()函數(shù)由10行代碼替換,那么你見過的程序會(huì)成什么樣子?如果所有代碼都在main()當(dāng)中,如果代碼都在一個(gè)文件中,怎么團(tuán)隊(duì)合作?函數(shù)和模塊化有什么關(guān)系?函數(shù)是C語言中模塊化編程的最小單位函數(shù)(function)和 模塊(module)可以把每個(gè)函數(shù)看作一個(gè)模塊若干相關(guān)的函數(shù)可以合并作一個(gè)“模塊”main()printf()scanf()power()putchar()getchar()main()stdio:printf()scanf()putchar()getchar()mymdl:power()4.1 函數(shù)概述在實(shí)際應(yīng)用中,對于一
3、個(gè)問題很復(fù)雜或很龐大時(shí),一般是將其分解為若干相對小且簡單的子問題進(jìn)行解決。每一個(gè)子問題的在C語言中是用函數(shù)描述的。因此,人們稱C語言程序是由一系列函數(shù)組成的,由此也可以看出C語言是支持結(jié)構(gòu)化程序設(shè)計(jì)的。 自頂向下逐步求精4.1 函數(shù)概述總?cè)蝿?wù)子任務(wù)1子任務(wù)2子任務(wù)n子任務(wù)21子任務(wù)22子任務(wù)n1子任務(wù)n2子任務(wù)n3子任務(wù)221圖1 結(jié)構(gòu)化任務(wù)劃分示意4.1 函數(shù)概述C語言中的函數(shù)分為兩類:由系統(tǒng)提供的標(biāo)準(zhǔn)庫函數(shù)由程序員自定義的函數(shù)函數(shù)的主要作用是用來完成重復(fù)任務(wù),或者完成具有獨(dú)立功能的模塊。在C語言中,程序是由一個(gè)主函數(shù)main( )和其他若干函數(shù)構(gòu)成的。在主函數(shù)main( )中可以調(diào)用其他函
4、數(shù)(調(diào)用函數(shù)即執(zhí)行函數(shù)),其他函數(shù)之間也可以互相調(diào)用。函數(shù)之間的調(diào)用關(guān)系如圖2所示:4.1 函數(shù)概述主函數(shù)子函數(shù)1子函數(shù)2子函數(shù)n子函數(shù)21子函數(shù)22子函數(shù)n1子函數(shù)n2子函數(shù)n3子函數(shù)221圖2 函數(shù)之間的調(diào)用關(guān)系示意圖4.1 函數(shù)概述一個(gè)C程序可以由一個(gè)或多個(gè)函數(shù)組成;一個(gè)C程序必須從main()函數(shù)開始執(zhí)行。 函數(shù)間可以相互調(diào)用,但不能調(diào)用main函數(shù),它是由系統(tǒng)調(diào)用的;函數(shù)又分為如下兩類:無參函數(shù)和帶參函數(shù)。參數(shù)用來向函數(shù)傳遞不同的數(shù)據(jù)。函數(shù)都可以返回或不返回一個(gè)函數(shù)值。返回一個(gè)函數(shù)值可供調(diào)用它的函數(shù)使用,或者用來判斷函數(shù)的執(zhí)行狀態(tài)。4.2.1 函數(shù)的定義形式 () 用括起,表示該部分
5、內(nèi)容可以省略; 用括起,表示這部分是必要的。4.2 函數(shù)定義4.2 函數(shù)定義說明:1、用于確定這個(gè)函數(shù)的返回值的類型,如整型、實(shí)型、字符型等。默認(rèn)類型是int型。2、定義了函數(shù)的名稱,通過這個(gè)名稱才能對某個(gè)函數(shù)進(jìn)行調(diào)用。 3、規(guī)定了函數(shù)有什么樣的參數(shù)。形式參數(shù)的作用是控制函數(shù)進(jìn)行什么樣的操作,它們的值由調(diào)用這個(gè)函數(shù)的程序給出。根據(jù)函數(shù)有無參數(shù),又可以把函數(shù)分為無參函數(shù)和有參函數(shù),若形式參數(shù)有多個(gè),則形式參數(shù)之間用逗號隔開,由主調(diào)函數(shù)通過參數(shù)向被調(diào)函數(shù)傳遞數(shù)據(jù)。4.2.1 函數(shù)的定義形式4. 部分規(guī)定了形式參數(shù)的類型。形參與形參的類型說明可以分開描述,如:fun (x, y, z) int x,
6、 y, z;也可以放在一起,寫成:fun (int x, int y, int z)5. 規(guī)定了在函數(shù)內(nèi)部要用到的變量以及它們的類型。6. 規(guī)定了函數(shù)中要執(zhí)行的語句。函數(shù)體語句和變量定義部分用一對大括號括起來。函數(shù)名命名Windows風(fēng)格函數(shù)名命名用大寫字母開頭的單詞組合而成 變量名形式“名詞”或者“形容詞+名詞”如變量名oldValue與newValue等函數(shù)名形式“動(dòng)詞”或者“動(dòng)詞+名詞”(動(dòng)賓詞組)如函數(shù)名GetMax()等 4.2.1 函數(shù)的定義形式例4.2 關(guān)于函數(shù)的定義。 int max(x, y) int x, y; int t; t = (xy) ? x:y ; return(
7、t); main( ) int a, b, c; scanf (“%d, %d”, &a, &b); c = max(a, b); printf (“This max is: %dn”, c); 類型說明符X,y是形式參數(shù)無返回值無形式參數(shù)形式參數(shù)類型說明函數(shù)名a,b是實(shí)參4.2.1 函數(shù)的定義形式(2)a,b是實(shí)在參數(shù);c為main函數(shù)中的局部變量x,y是形式參數(shù); t為max函數(shù)中的局部變量 程序執(zhí)行順序: 運(yùn)行主程序main() 當(dāng)執(zhí)行c=max(a,b)語句時(shí),調(diào)用函數(shù)max max函數(shù)的運(yùn)行結(jié)果由return語句返回 main函數(shù)中輸出結(jié)果4.2.2 空函數(shù)按如下方式定義的函數(shù)稱為空
8、函數(shù): ( ) 在結(jié)構(gòu)化程序設(shè)計(jì)中,可將那些功能較復(fù)雜、作用較為次要的函數(shù)先定義成空函數(shù),集中精力編寫那些基本的、常用的函數(shù),邊編寫邊調(diào)試。最后再一步一步的完善各個(gè)函數(shù)。這樣的程序可讀性好,易調(diào)試,易維護(hù),易擴(kuò)充。4.3 函數(shù)參數(shù)與函數(shù)的返回值4.3.1 形式參數(shù)與實(shí)在參數(shù)1. 形式參數(shù)在定義函數(shù)時(shí)函數(shù)名后括號內(nèi)的變量表列就稱為形式參數(shù)表。只有當(dāng)函數(shù)被調(diào)用時(shí),形參才在內(nèi)存中開辟空間。調(diào)用結(jié)束后,形參自動(dòng)從內(nèi)存中被釋放掉。 2、實(shí)在參數(shù)在調(diào)用函數(shù)時(shí)函數(shù)名后括號內(nèi)的變量表列被稱為實(shí)在參數(shù)表。K4-14.3.1 形式參數(shù)與實(shí)在參數(shù)2. 實(shí)在參數(shù)實(shí)參的作用是給相應(yīng)的形參賦值,所以在調(diào)用函數(shù)前,實(shí)參必須
9、要有一個(gè)確切的值,它可以是常量、變量或表達(dá)式。實(shí)參與形參的關(guān)系是單向賦值的關(guān)系。3. 形參類型在函數(shù)定義中,必須規(guī)定形參的類型。有兩種定義方式,如:int max(x, y, z) 或int max(int x, int y, float z)int x, y; float z; 4.3.1 形式參數(shù)與實(shí)在參數(shù)4. 實(shí)參與形參的結(jié)合:單向賦值傳遞!例4.3 關(guān)于實(shí)參與形參的結(jié)合的例子。 int echonum( int i, int j ) int t; t = i; i = j; j = t; printf(“In function i = %d, j = %dn”, i, j); main
10、( ) int i = 6, j = 8; echonum(i, j); printf(“Out function i = %d, j = %dn”, i, j); 程序運(yùn)行結(jié)果: In function i = 8, j = 6 Out function i = 6, j = 8EX4-34.3.2 函數(shù)的返回值return語句的一般格式如下: return (); 或 return ;它的功能是將表達(dá)式的值作為函數(shù)的返回值返回,結(jié)束本次函數(shù)調(diào)用并回到調(diào)用函數(shù)語句。return;如果只想從函數(shù)返回而不想帶回返回值,可以使用不帶表達(dá)式的方式,也可以省略不寫return語句。void echol
11、ine(); 明確函數(shù)無返回值不加類型說明的函數(shù),自動(dòng)按整形處理。但TC+3.0要求必須指定函數(shù)類型,否則編譯不通過。函數(shù)返回值的說明:1、函數(shù)中可以有多個(gè)return語句,執(zhí)行到哪個(gè)return語句,就從那一個(gè)return語句返回。2、return只能返回一個(gè)值,而不能返回多個(gè)值。3、return(表達(dá)式) 語句中的表達(dá)式值的類型應(yīng)與定義函數(shù)時(shí)函數(shù)的類型一致。K4-24.4 函數(shù)的調(diào)用4.4.1 函數(shù)調(diào)用格式函數(shù)調(diào)用的一般格式: ()有多個(gè)實(shí)參,要用逗號將實(shí)參變量隔開;實(shí)參和形參必須個(gè)數(shù)相等,順序依次對應(yīng)。當(dāng)實(shí)參和對應(yīng)形參類型不一致時(shí),先將實(shí)參的類型轉(zhuǎn)換成形參的類型后再傳遞。如果這個(gè)函數(shù)是無
12、參函數(shù),那么實(shí)參表列可以省略,但括號不能省略。4.4.1 函數(shù)調(diào)用格式在C語言中,我們可以將函數(shù)調(diào)用當(dāng)成一個(gè)表達(dá)式,如果在這個(gè)表達(dá)式后加一個(gè)分號,就成為函數(shù)調(diào)用語句;函數(shù)實(shí)參的求值順序在各C語言系統(tǒng)中是不一樣的,有的是從左到右,有的是從右到左。參見書P1114.4.2 函數(shù)調(diào)用規(guī)則被調(diào)用函數(shù)必須是已經(jīng)存在的函數(shù)、庫函數(shù)或用戶已定義過的函數(shù)。如果使用庫函數(shù),還要在使用庫函數(shù)的源文件開頭用#include聲明庫函數(shù)所在的頭文件。如果使用用戶自定義的函數(shù),還要在主調(diào)函數(shù)中說明用戶函數(shù)的返回值類型,函數(shù)說明的一般形式為: ( );4.4.2 函數(shù)調(diào)用規(guī)則C語言規(guī)定在以下幾種情況中,可以不在主調(diào)函數(shù)中說
13、明函數(shù)的返回值類型:如果被調(diào)用函數(shù)的返回值為整型或字符型時(shí),可不進(jìn)行說明。如果被調(diào)用函數(shù)在主調(diào)函數(shù)之前定義,也可不進(jìn)行說明。推薦在程序的開頭對程序中的所有函數(shù)進(jìn)行定義;P112例4.44.5 函數(shù)的嵌套調(diào)用和遞歸調(diào)用調(diào)用關(guān)系上來看,函數(shù)之間就存在兩種關(guān)系:嵌套關(guān)系和遞歸關(guān)系。 4.5.1 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用表現(xiàn)在某個(gè)函數(shù)在執(zhí)行過程中,又可以調(diào)用另外一個(gè)函數(shù)。也就是說,函數(shù)在執(zhí)行過程中,不是執(zhí)行完一個(gè)函數(shù)再去執(zhí)行另一個(gè)函數(shù)而是可以在任何需要的時(shí)候?qū)ζ渌瘮?shù)進(jìn)行調(diào)用。4.5.1 函數(shù)的嵌套調(diào)用例4.7 關(guān)于函數(shù)的嵌套調(diào)用 #include main( ) int i , j , k; i
14、 = 0; j = 1; k = 2; k = q(0, k); printf(“%4d %4d %4dn”, i,j,k); k = q(1, k); printf(“%4d %4d %4dn”, i,j,k); j = q(2, j); printf(“%4d %4d %4dn”, i,j,k); EX4-74.5.1 函數(shù)的嵌套調(diào)用 int q(int h, int j) int i; i = j; if (h = 0) j = p(j); else i = p(i); printf(“%4d %4d %4dn”, i, j, h); return(j); int p(int i) re
15、turn(+i); 運(yùn)行結(jié)果:230013431013212013EX4-74.5.1 函數(shù)的嵌套調(diào)用 下圖給出例4.7程序執(zhí)行的流程。序號表示執(zhí)行的先后關(guān)系。main( )函數(shù)調(diào)用q( )函數(shù)main( )函數(shù)結(jié)束q( )函數(shù)p( )函數(shù)調(diào)用p( )函數(shù)q( )函數(shù)結(jié)束p( )函數(shù)結(jié)束123456789從圖中可以看出,函數(shù)在執(zhí)行過程中可以對另一函數(shù)進(jìn)行調(diào)用,即實(shí)現(xiàn)了函數(shù)的嵌套調(diào)用。4.5.2 函數(shù)的遞歸調(diào)用如果在調(diào)用函數(shù)時(shí),被調(diào)用函數(shù)又是函數(shù)本身,那么這種調(diào)用就被稱為函數(shù)的遞歸調(diào)用。函數(shù)的遞歸調(diào)用分直接遞歸調(diào)用和間接遞歸調(diào)用。如果在調(diào)用函數(shù)的本身又出現(xiàn)直接調(diào)用該函數(shù)本身,則稱為函數(shù)的直接遞歸
16、調(diào)用;如果在調(diào)用函數(shù)的本身又出現(xiàn)間接調(diào)用該函數(shù)本身,則稱為函數(shù)的間接遞歸調(diào)用。P116例4.84.5.2 函數(shù)的遞歸調(diào)用采用遞歸方法解決的問題一般應(yīng)符合以下條件:可以把該問題化為一個(gè)新問題,新問題的解決方法與原問題的解決方法相同,只是所處理的對象有規(guī)律的遞增或遞減,相對簡單一些。通過轉(zhuǎn)換最終使問題得到解決。必須有一個(gè)結(jié)束遞歸的條件。因此,遞歸程序由兩大部分構(gòu)成:當(dāng)某一條件成立時(shí)不再進(jìn)行遞歸調(diào)用,即結(jié)束遞歸。當(dāng)條件不成立時(shí)仍然進(jìn)行遞歸調(diào)用。4.5.2 函數(shù)的遞歸調(diào)用例4.9 n的階乘可以采用兩種形式定義: (1) n! = 1 * 2 * 3 * 4 * * n (2) 1 當(dāng)n = 1時(shí) f(
17、n)= n! = n * f(n-1) 當(dāng)n 1時(shí) 第二種就是遞歸定義。程序如下:long facl( int n ) long f; if (n = 1) f = 1; else f = n * facl(n-1); return ( f ) ; 4.5.2 函數(shù)的遞歸調(diào)用例4.10 在進(jìn)行人口普查時(shí),人口普查員問一戶農(nóng)家的主人:“你家有幾個(gè)孩子?”主人答:“五個(gè)”,“您大孩子多大了?”“比老二大兩歲”,“那老二多大了?”“比老三大兩歲”,“那老三多大了?”“比老四大兩歲”,“那老四多大了?”“比老五大兩歲”,“那老五多大了?”“老五一歲了”這時(shí)才知道老大九歲了。我們可以列一組式子:AGE(
18、1) = AGE(2) +2; AGE(2) = AGE(3 )+2; AGE(3) = AGE(4) +2; AGE(4) = AGE(5) +2; AGE(5) = 1;P117例4.104.5.2 函數(shù)的遞歸調(diào)用簡化一下,可得到如下的數(shù)學(xué)式子: 1 N = 5 AGE(N) = AGE(N+1)+2 1N0 這個(gè)過程就是遞歸的過程,程序如下:float power( float x, int n ) float y; printf(“begin n=%dn”,n); if (n = 0) y = 1; else y = x * power(x,n-1); printf(“end n=%d
19、n”,n); return ( y ) ; 4.5.2 函數(shù)的遞歸調(diào)用 main( ) float z , t ; t = 2. 0; z = power(t ,3); printf(“z=%5.1f n”, z ); 運(yùn)行結(jié)果: begin n=3begin n=2 begin n=1begin n=0 end n=0 end n=1 end n=2 end n=3 z=8.0 下面講變量的分類:從變量的作用域分:全局變量局部變量從變量存儲(chǔ)類別和生存周期分:靜態(tài)存儲(chǔ)類型動(dòng)態(tài)存儲(chǔ)類型4.6 變量作用域任何一個(gè)變量都是有它的管轄范圍,也稱為變量的作用域。只有在變量的作用域范圍內(nèi)才能使用這個(gè)變量。
20、在C語言中如果按作用域分,變量分為局部變量和全局變量。4.6.1 局部變量在一個(gè)函數(shù)內(nèi)部定義的變量被稱為局部變量局部變量只能在定義它的函數(shù)內(nèi)部使用,而不能在其它函數(shù)內(nèi)使用這個(gè)變量。4.6.1 局部變量說明:main函數(shù)內(nèi)部定義的變量只能在main函數(shù)內(nèi)部使用,而在其它函數(shù)內(nèi)部不能使用main函數(shù)內(nèi)部定義的變量。不同的函數(shù)中可以使用相同的變量名,但它們是屬于不同函數(shù)的變量,它們的作用域是不同的,在不同的區(qū)域內(nèi)分配空間。形參也屬于局部變量,作用范圍在定義它的函數(shù)內(nèi),在定義形參和函數(shù)體內(nèi)的變量不能重名;P119 4.6.14.6.2 全局變量例4.11 關(guān)于全局變量int x, y;/*外部變量*/
21、 float f1(int a) float a, b; int f2(int c) 全局變量x,y int z ;的作用范圍 全局變量a,b main( )的作用范圍 int m, n ; 在函數(shù)外部定義的變量稱為外部變量,外部變量屬于全局變量。全局變量的作用域是從定義變量的位置開始到本源文件結(jié)束。4.6.2 全局變量說明:1、在一個(gè)函數(shù)內(nèi)部,既可以使用本函數(shù)定義的局部變量,也可以使用在此函數(shù)前定義的全局變量。2、全局變量的作用是使得函數(shù)間多了一種傳遞信息的方式。如果在一個(gè)程序中各個(gè)函數(shù)都要對同一個(gè)信息進(jìn)行處理,就可以將這個(gè)信息定義成全局變量。例4.12 對一個(gè)數(shù)組進(jìn)行排序,排序結(jié)果顯示在屏
22、幕上。要求用函數(shù)來實(shí)現(xiàn)。EX4-12void sort( );void echoa( );int a5 = 5, 6, 7, 3, 2;main( ) echoa( ); sort( ); echoa( );void echoa( ) int i; for(i = 0; i5; i +) printf(“%3d”, ai); printf(“n”); int n=5;void sort( ) int i, j, min, t; for(i=0;in-1;i+) min=i; for(j=i+1;jn;j+)if(ajamin) min = j; t = ai; ai = amin; amin
23、= t; 程序運(yùn)行結(jié)果:5 6 7 3 2 2 3 5 6 7第 i 輪置換后,ai是余下的(n-i)個(gè)數(shù)中最小的,即依次求出第一個(gè)、第二個(gè)、第n個(gè)最小的數(shù)4.6.2 全局變量優(yōu)點(diǎn):全局變量使函數(shù)之間的數(shù)據(jù)交換更容易,也更高效可以使用全局變量減少函數(shù)實(shí)參和形參個(gè)數(shù)缺點(diǎn):誰都可以改寫全局變量,所以很難確定是誰改寫了它全局變量在全部執(zhí)行過程中都占用存儲(chǔ)單元不推薦使用全局變量!4.6.2 全局變量用extern定義外部變量的一般格式: extern 其作用是告訴系統(tǒng)這個(gè)函數(shù)中使用的變量是外面定義的全局變量,它在內(nèi)存中不產(chǎn)生新的變量。如果在一個(gè)函數(shù)內(nèi)部,一個(gè)局部變量和全局變量重名,那么是局部變量起作用
24、,而外部變量不起作用。P122 4.144.6.2 全局變量程序如下:int a =3, b =5;int max(a, b)int a, b; return (ab ? a : b);main( ) int a = 8; printf(“%d”, max(a, b); 程序運(yùn)行結(jié)果:8例4.14 關(guān)于全局變量和局部變量重名的例子。思考:為什么全局變量的作用域是從定義變量的位置開始到本源文件結(jié)束,甚至可以是在多個(gè)文件中使用?為什么局部變量只能在在定義它的函數(shù)內(nèi)部使用?實(shí)際上取決于變量在內(nèi)存中的存儲(chǔ)類型4.7 變量存儲(chǔ)類別與生存周期系統(tǒng)開機(jī)后,內(nèi)存被分為兩大塊。一塊是系統(tǒng)區(qū),存放操作系統(tǒng)等內(nèi)容;
25、另一塊是用戶區(qū),用來存放被執(zhí)行的用戶程序。一個(gè)C程序在運(yùn)行時(shí),用戶區(qū)被分為三大塊:程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū) 用來存放C程序運(yùn)行代碼 用來存放全局變量 用來存放如形參、函數(shù)體內(nèi)部定義的局部變量動(dòng)態(tài)存儲(chǔ)是根據(jù)需要臨時(shí)分配存儲(chǔ)空間,離開即釋放靜態(tài)存儲(chǔ)是在程序運(yùn)行期間分配固定的存儲(chǔ)空間不釋放4.7 變量存儲(chǔ)類別與生存周期變量的存儲(chǔ)類型指數(shù)據(jù)在內(nèi)存中存儲(chǔ)的方式,即編譯器為變量分配內(nèi)存的方式,它決定變量的生存期。程序運(yùn)行期間變量在內(nèi)存中存在的時(shí)間稱為變量的生存周期。靜態(tài)存儲(chǔ)類別的生存周期是固定的,動(dòng)態(tài)存儲(chǔ)類別的生存周期是根據(jù)變量調(diào)用而定除了前面講的外部變量extern(全局變量)和形參的聲明,還有哪些方
26、式可以確定它的存儲(chǔ)類別?4.7 變量存儲(chǔ)類別與生存周期在C語言中,每一個(gè)變量都有兩個(gè)屬性:數(shù)據(jù)類型數(shù)據(jù)的存儲(chǔ)類別在C語言中,共有四種存儲(chǔ)類別:自動(dòng)存儲(chǔ)類別(auto)局部變量寄存器存儲(chǔ)類別(register)外部存儲(chǔ)類別(extern)全局變量靜態(tài)存儲(chǔ)類別(static)4.7 變量存儲(chǔ)類別與生存周期程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)局部變量(形參)、自動(dòng)變量、函數(shù)調(diào)用的現(xiàn)場、寄存器存儲(chǔ)類別外部存儲(chǔ)類別、全局變量和靜態(tài)存儲(chǔ)類別的變量4.7.1 靜態(tài)存儲(chǔ)變量static凡是用關(guān)鍵字static定義的變量全部被稱為靜態(tài)變量;靜態(tài)存儲(chǔ)變量又分為:局部靜態(tài)存儲(chǔ)變量全局靜態(tài)存儲(chǔ)變量它們都存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū)內(nèi),在程
27、序的整個(gè)運(yùn)行期間這些靜態(tài)變量都存在。都用static聲明,聲明的位置不同一個(gè)是函數(shù)前面,一個(gè)是函數(shù)內(nèi)部4.7.1 靜態(tài)存儲(chǔ)變量static局部靜態(tài)變量指的是在函數(shù)中用關(guān)鍵字static定義的變量,其作用范圍是從定義它的函數(shù)時(shí)起作用;局部靜態(tài)變量存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū),在函數(shù)返回時(shí)這個(gè)靜態(tài)變量不會(huì)被釋放,仍然保存它的值。如果再次調(diào)用這個(gè)函數(shù)時(shí),我們就可以直接使用這個(gè)保存下來的值。這是和前面講的局部變量的最大區(qū)別和全局變量有點(diǎn)像4.154.7.1 靜態(tài)存儲(chǔ)變量static例4.15 關(guān)于靜態(tài)變量 int sub( ) static int y = 0;y+;return(y); main( ) int
28、i;for(i = 0; i 5; i +) printf(“%3d”, sub(); 程序運(yùn)行結(jié)果:1 2 3 4 54.7.1 靜態(tài)存儲(chǔ)變量static說明:局部的靜態(tài)變量如果不對其進(jìn)行初始化,系統(tǒng)會(huì)自動(dòng)對其賦值0。雖然局部的靜態(tài)變量在函數(shù)返回后依然存在,但由于它是局部變量,所以其它函數(shù)仍然不能對它進(jìn)行引用。C語言規(guī)定,只有存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū)中的變量才能對其進(jìn)行初始化,即,只有對全局變量和用static定義的變量才能進(jìn)行自動(dòng)初始化。其他類型的變量,比如局部變量必須在程序中初始化后才能使用4.7.2 動(dòng)態(tài)存儲(chǔ)變量auto®ister動(dòng)態(tài)存儲(chǔ)變量有兩種:自動(dòng)變量和寄存器變量1. 自動(dòng)變量動(dòng)
29、態(tài)存儲(chǔ)變量是存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)的,這種變量只在定義它們的時(shí)候才創(chuàng)建,在定義它們的函數(shù)返回時(shí)系統(tǒng)回收這些變量所占內(nèi)存。對這些變量的創(chuàng)建和回收是由系統(tǒng)自動(dòng)完成的,所以叫自動(dòng)變量(用關(guān)鍵字auto定義)。關(guān)鍵字auto可以省略。最典型的例子就是函數(shù)中定義的局部變量和形參4.7.2 動(dòng)態(tài)存儲(chǔ)變量auto®ister2. 寄存器變量一般情況下所有的變量是存放在內(nèi)存中的。如果有一個(gè)變量在某一段時(shí)間內(nèi)重復(fù)使用的次數(shù)很多,如循環(huán)變量,允許將它存放在寄存器中,以提高程序的運(yùn)行時(shí)間,這種變量被稱為“寄存器變量”,用關(guān)鍵字register定義。在C程序中寄存器變量的數(shù)目也有一定的限制,只有動(dòng)態(tài)變量才能作為寄存器
30、變量。4.7.3 外部存儲(chǔ)變量extern外部變量就是在函數(shù)的外部定義的全局變量,用關(guān)鍵字extern來說明,它的作用域是從變量的定義開始到整個(gè)程序的結(jié)束;用extern來聲明外部變量在一個(gè)文件內(nèi)部聲明外部變量在多個(gè)文件的程序中聲明外部變量用static來聲明外部變量P126 4.174.7.5 變量的生存周期變量的生存周期和變量的作用域可分為如下幾類:局部變量(auto)的生存周期,從定義它的函數(shù)運(yùn)行開始到函數(shù)運(yùn)行結(jié)束。其作用域在定義它的函數(shù)內(nèi)。靜態(tài)局部變量static的生存周期,從程序的運(yùn)行開始到整個(gè)程序運(yùn)行結(jié)束。其作用域?yàn)槎x它的函數(shù)內(nèi)。4.7.5 變量的生存周期(續(xù))全局變量exter
31、n的生存周期,從整個(gè)源程序運(yùn)行開始到整個(gè)程序運(yùn)行結(jié)束。其作用域?yàn)檎麄€(gè)源程序內(nèi)。靜態(tài)全局變量static的生存周期,從定義它的源程序運(yùn)行開始到定義它的源程序運(yùn)行結(jié)束。其作用域在定義它的源程序內(nèi)。只有深刻理解變量的作用域、存儲(chǔ)類別和變量的生存周期的含義,才能寫出高質(zhì)量的C程序!全局和局部變量都有動(dòng)態(tài)和靜態(tài)兩種存儲(chǔ)方式常用的是全局變量靜態(tài)存儲(chǔ),局部變量采用動(dòng)態(tài)存儲(chǔ)靜態(tài)局部變量和靜態(tài)全局變量是兩個(gè)特例!static要慎用4.7.5 變量的生存周期變量的作用范圍在什么范圍是可以調(diào)用的,超過此范圍就無法調(diào)用變量的生存周期從分配內(nèi)存到內(nèi)存釋放生存周期和作用范圍是不同的概念在生存周期內(nèi)不能保障其他文件(靜態(tài)全
32、局變量)或函數(shù)(靜態(tài)局部變量)是可以調(diào)用的(即在作用范圍內(nèi))參見譚浩強(qiáng)P198 表8-2 各種類型變量的作用域和存在性的情況4.8 內(nèi)部函數(shù)和外部函數(shù)一個(gè).prj工程文件可以由多個(gè).C源文件組成但是只能有一個(gè)main()函數(shù)不同源文件文件可以訪問全局變量實(shí)現(xiàn)變量共享一個(gè).C源文件可以由多個(gè)函數(shù)組成不同源文件可以相互調(diào)用函數(shù)實(shí)現(xiàn)函數(shù)共享不同源文件之間通過互相調(diào)用函數(shù)和共享全局變量聯(lián)系起來4.8 內(nèi)部函數(shù)和外部函數(shù)根據(jù)函數(shù)是否能被其它源程序文件調(diào)用,又將函數(shù)分為內(nèi)部函數(shù)和外部函數(shù)。4.8.1 內(nèi)部函數(shù)為了防止其它源程序文件中的函數(shù)調(diào)用本源程序文件中的某些函數(shù),在函數(shù)定義前面加上關(guān)鍵字“static
33、”,則稱此函數(shù)為內(nèi)部函數(shù)。例如:static int max(a, b); 這個(gè)max函數(shù)只能在本源文件中使用。4.8.1 內(nèi)部函數(shù)舉例例4.18 關(guān)于簡化了的通信的例子。設(shè)置一個(gè)管理信箱的函數(shù)mail_box( ),在程序中通過send( )函數(shù)向其發(fā)信,再通過receive( )函數(shù)從信箱中接收信件。為了保證信箱的安全性,將管理信箱的函數(shù)mail_box( )、send( )函數(shù)、receive( )函數(shù)建立在一個(gè)源程序文件中,取名mail.c。4.8.1 內(nèi)部函數(shù)舉例 #define MAX 50 #include static void mail_box(char mail , cha
34、r p) static char mailboxMAX; if (p = s) strcpy(mailbox, mail);else if (p = r) strcpy(mail, mailbox); extern void send (char mail )mail_box(mail, s);extern void receive (char mail )mail_box(mail, r);外部函數(shù)send定義extern可省略靜態(tài)局部變量內(nèi)部函數(shù)4.8.1 內(nèi)部函數(shù)舉例 在另一個(gè)源文件mymail.c中可以這樣來調(diào)用extern void send ( ) ;extern void rec
35、eive ( );main( ) char s50, r50; gets(s); send(s); receive(r); puts(r);程序運(yùn)行結(jié)果:Hello!Hello!外部函數(shù)說明 不帶參數(shù)4.8.2 外部函數(shù)如果函數(shù)不僅能被本源文件的函數(shù)調(diào)用,還可以被其它源文件中的函數(shù)調(diào)用,則稱此函數(shù)為外部函數(shù)。外部函數(shù)定義:extern int max(a, b);extern關(guān)鍵字可以省略如果在源文件A中調(diào)用另一個(gè)源文件B中的函數(shù),那么在源文件A中要調(diào)用的函數(shù)進(jìn)行說明。格式:extern int max( );要區(qū)別函數(shù)定義和函數(shù)說明4.8.2 外部函數(shù)舉例例4.19 外部函數(shù)的定義,說明和調(diào)
36、用文件f1.c的內(nèi)容: extern void sorta(), echoa(); extern void echoa(int a ); extern int min(); main() static int a =3,8,5,1,7; echoa(a); sorta(a,5); echoa(a); printf(“The min is:%3dn”,min(a);調(diào)用外部函數(shù)的說明4.294.8.2 外部函數(shù)舉例 源文件f2.c的內(nèi)容如下:extern void echoa(int a ) int i; for(i=0;i5;i+) printf(“%3d”,ai); printf(“n”);函數(shù)echoa定義4.294.8.2 外部函數(shù)舉例源文件f3.c的內(nèi)容如下: extern void sorta(int a ,int n ) int i, j, min, t; for(i=0;in-1;i+)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 各班安全主題教育活動(dòng)
- 關(guān)于寵物的課件英語
- 數(shù)據(jù)結(jié)構(gòu)與算法 課件 第六章圖結(jié)構(gòu)
- 2024年石家莊客運(yùn)駕駛從業(yè)資格證模擬考試答案
- 2024年迪慶道路旅客運(yùn)輸從業(yè)資格證模擬試題
- 2024年新疆客運(yùn)上崗證模擬考試0題
- 2024年上??瓦\(yùn)員初級理論知識試卷題庫
- 2024年廣州旅客運(yùn)輸從業(yè)資格證考試題庫
- 2025屆廣東省潮州市高一生物第一學(xué)期期末統(tǒng)考模擬試題含解析
- 2024年涼山州客運(yùn)上崗證模擬考試題答案
- GB/T 44715-2024民用輕小型無人機(jī)碰撞安全性要求
- 期中考試卷(試題)-2024-2025學(xué)年蘇教版二年級數(shù)學(xué)上冊
- 2024年湖南省長沙市中考?xì)v史試卷(附答案)
- 競賽狀態(tài)焦慮量表
- 火力發(fā)電廠燃料統(tǒng)計(jì)及核算
- 公司常規(guī)會(huì)議排程表
- 5自我探索—價(jià)值觀
- 部編人教版六年級數(shù)學(xué)上冊應(yīng)用題與解決問題提高班專項(xiàng)練習(xí)精編
- 《電子技術(shù)基礎(chǔ)》期中考試試卷及參考答案
- 淺談中班幼兒動(dòng)手能力的培養(yǎng)
- 市場細(xì)分案例篇PPT課件
評論
0/150
提交評論