最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【回顧】C程序設(shè)計第七章筆記

2021-03-19 09:31 作者:陪看書的小白  | 我要投稿

C程序設(shè)計(譚浩強第五版)第七章筆記

用函數(shù)實現(xiàn)模塊化程序設(shè)計

1.為什么要用函數(shù)?

如果執(zhí)行這個:

int main()

{

{

? 功能1內(nèi)容

}


{

? 功能2內(nèi)容

}


{

? 功能1內(nèi)容

}


{

? 功能2內(nèi)容

}

}

代碼太冗長。難閱讀,難修改。

改成下面的形式:


功能1函數(shù)()

{

? 功能1內(nèi)容

}


功能2函數(shù)()

{

? 功能2內(nèi)容

}


int main()

{

調(diào)用功能1

調(diào)用功能2

調(diào)用功能1

調(diào)用功能2

}


結(jié)構(gòu)精煉,易于閱讀,易于修改。結(jié)構(gòu)清晰基于它的結(jié)構(gòu)化或者說是模塊化設(shè)計。


我們總結(jié)一下:

函數(shù)的特點:

①.使用函數(shù)可使程序清晰、精煉、簡單、靈活。

②.函數(shù)就是功能。每一個函數(shù)用來實現(xiàn)一個特定的功能。函數(shù)名應(yīng)反映其代表的功能。

③.在設(shè)計較大程序時,往往把它分為若干個程序模塊,每一個模塊包括一個或多個函數(shù),每個函數(shù)實現(xiàn)一個特定的功能。

④.一個C程序可由一個主函數(shù)和若干個其他函數(shù)構(gòu)成。由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。

再來回答為什么要用函數(shù):

(1) 一個C程序由一個或多個程序模塊組成,每一個程序模塊作為一個源程序文件。較大的程序,可分別放在若干個源文件中。這樣便于分別編寫和編譯,提高調(diào)試效率。一個源程序文件可以為多個C程序共用。

(2) 一個源程序文件由一個或多個函數(shù)以及其他有關(guān)內(nèi)容(如指令、數(shù)據(jù)聲明與定義等)組成。一個源程序文件是一個編譯單位,在程序編譯時是以源程序文件為單位進(jìn)行編譯的,而不是以函數(shù)為單位進(jìn)行編譯的。

(3) C程序的執(zhí)行是從main函數(shù)開始的,如果在main函數(shù)中調(diào)用其他函數(shù),在調(diào)用后流程返回到main函數(shù),在main函數(shù)中結(jié)束整個程序的運行。

(4) 所有函數(shù)都是平行的,即在定義函數(shù)時是分別進(jìn)行的,是互相獨立的。一個函數(shù)并不從屬于另一個函數(shù),即函數(shù)不能嵌套定義。函數(shù)間可以互相調(diào)用,但不能調(diào)用main函數(shù)。main函數(shù)是被操作系統(tǒng)調(diào)用的。

(5) 從用戶使用的角度看,函數(shù)有兩種。

① 庫函數(shù),它是由系統(tǒng)提供的,用戶不必自己定義,可直接使用它們。應(yīng)該說明,不同的C語言編譯系統(tǒng)提供的庫函數(shù)的數(shù)量和功能會有一些不同,當(dāng)然許多基本的函數(shù)是共同的。

② 用戶自己定義的函數(shù)。它是用以解決用戶專門需要的函數(shù)。

(6) 從函數(shù)的形式看,函數(shù)分兩類。

① 無參函數(shù)。在調(diào)用無參函數(shù)時,主調(diào)函數(shù)不向被調(diào)用函數(shù)傳遞數(shù)據(jù)。

② 有參函數(shù)。主調(diào)函數(shù)在調(diào)用被調(diào)用函數(shù)時,通過參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù)。

2.定義函數(shù)

C語言要求,在程序中用到的所有函數(shù),必須“先定義,后使用”。

定義函數(shù)應(yīng)包括以下幾個內(nèi)容:?

(1) 指定函數(shù)的名字,以便以后按名調(diào)用。

(2) 指定函數(shù)的類型,即函數(shù)返回值的類型。

(3) 指定函數(shù)的參數(shù)的名字和類型,以便在調(diào)用函數(shù)時向它們傳遞數(shù)據(jù)。對無參函數(shù)不需要這項。

(4) 指定函數(shù)應(yīng)當(dāng)完成什么操作,也就是函數(shù)是做什么的,即函數(shù)的功能。這是最重要的,是在函數(shù)體中解決的。

定義函數(shù)的方法(三種:無參函數(shù),有參函數(shù),空函數(shù)。這里沒有分析返回值類型)

(1).定義無參函數(shù)

類型名? 函數(shù)名()

{

函數(shù)體

}

或者

類型名? 函數(shù)名(void)

{

函數(shù)體

}

函數(shù)名后面括號內(nèi)的void表示“空”,即函數(shù)沒有參數(shù)。

函數(shù)體包括聲明部分和語句部分。

在定義函數(shù)時要用“類型標(biāo)識符”(即類型名)指定函數(shù)值的類型,即指定函數(shù)帶回來的值的類型。

(2).定義有參函數(shù)

類型名? 函數(shù)名(形式參數(shù)表列)

{

函數(shù)體

}

(3).定義空函數(shù)

類型名? 函數(shù)名()

{ }

作用:函數(shù)體為空,什么也不做。

3.調(diào)用函數(shù)

3.1函數(shù)調(diào)用的形式

語法:函數(shù)名(實參表列)

(1). 函數(shù)調(diào)用語句

把函數(shù)調(diào)用單獨作為一個語句。如printf_star();

這時不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作。

(2). 函數(shù)表達(dá)式

函數(shù)調(diào)用出現(xiàn)在另一個表達(dá)式中,如c=max(a,b);?

這時要求函數(shù)帶回一個確定的值以參加表達(dá)式的運算。

(3). 函數(shù)參數(shù)

函數(shù)調(diào)用作為另一個函數(shù)調(diào)用時的實參。如m=max(a,max(b,c));,又如:printf (″%d″, max (a,b));

3.2.形式參數(shù)和實際參數(shù)

①.在調(diào)用有參函數(shù)時,主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系。

②.在定義函數(shù)時函數(shù)名后面括號中的變量名稱為“形式參數(shù)”(簡稱“形參”)或“虛擬參數(shù)”。

③.在主調(diào)函數(shù)中調(diào)用一個函數(shù)時,函數(shù)名后面括號中的參數(shù)稱為“實際參數(shù)”(簡稱“實參”)。 實際參數(shù)可以是常量、變量或表達(dá)式,但要求它們有確定的值。

④.實參與形參的類型應(yīng)相同或賦值兼容。賦值兼容是指實參與形參類型不同時能按不同類型數(shù)值的賦值規(guī)則進(jìn)行轉(zhuǎn)換。

3.3.函數(shù)調(diào)用的過程

(1) 在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時,它們并不占內(nèi)存中的存儲單元。在發(fā)生函數(shù)調(diào)用時,函數(shù)的形參才被臨時分配內(nèi)存單元。

(2) 將實參的值傳遞給對應(yīng)形參。

(3) 在執(zhí)行函數(shù)期間,由于形參已經(jīng)有值,就可以利用形參進(jìn)行有關(guān)的運算。

(4) 通過return語句將函數(shù)值帶回到主調(diào)函數(shù)。應(yīng)當(dāng)注意返回值的類型與函數(shù)類型一致。如果函數(shù)不需要返回值,則不需要return語句。這時函數(shù)的類型應(yīng)定義為void類型。

(5) 調(diào)用結(jié)束,形參單元被釋放。注意: 實參單元仍保留并維持原值,沒有改變。如果在執(zhí)行一個被調(diào)用函數(shù)時,形參的值發(fā)生改變,不會改變主調(diào)函數(shù)的實參的值。因為實參與形參是兩個不同的存儲單元。

注意:

①.實參向形參的數(shù)據(jù)傳遞是“值傳遞”,單向傳遞,只能由實參傳給形參,而不能由形參傳給實參。

②.實參和形參在內(nèi)存中占有不同的存儲單元,實參無法得到形參的值。

3.4.函數(shù)的返回值

通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得到一個確定的值,這就是函數(shù)值(函數(shù)的返回值)。

(1) 函數(shù)的返回值是通過函數(shù)中的return語句獲得的。一個函數(shù)中可以有一個以上的return語句,執(zhí)行到哪一個return語句,哪一個return語句就起作用。return語句后面的括號可以不要,如“return z;”與“return(z);”等價。return后面的值可以是一個表達(dá)式。

(2) 函數(shù)值的類型。函數(shù)值的類型在定義函數(shù)時指定。

(3) 在定義函數(shù)時指定的函數(shù)類型一般應(yīng)該和return語句中的表達(dá)式類型一致。

如果函數(shù)值的類型和return語句中表達(dá)式的值不一致,則以函數(shù)類型為準(zhǔn)。對數(shù)值型數(shù)據(jù),可以自動進(jìn)行類型轉(zhuǎn)換。即函數(shù)類型決定返回值的類型。

(4) 對于不帶回值的函數(shù),應(yīng)當(dāng)用定義函數(shù)為“void類型”(或稱“空類型”)。這樣,系統(tǒng)就保證不使函數(shù)帶回任何值,即禁止在調(diào)用函數(shù)中使用被調(diào)用函數(shù)的返回值。此時在函數(shù)體中也沒有return語句。

3.5對被調(diào)用函數(shù)的聲明和函數(shù)原型

在一個函數(shù)中調(diào)用另一個函數(shù)(即被調(diào)用函數(shù))需要具備如下條件:?

(1) 被調(diào)用的函數(shù)必須是已經(jīng)定義的函數(shù)(是庫函數(shù)或用戶自己定義的函數(shù))。

(2) 如果使用庫函數(shù),應(yīng)該在本文件開頭用#include指令將調(diào)用有關(guān)庫函數(shù)時所需用到的信息“包含”到本文件中來。

(3) 如果使用用戶自己定義的函數(shù),而該函數(shù)的位置在調(diào)用它的函數(shù)(即主調(diào)函數(shù))的后面(在同一個文件中),應(yīng)該在主調(diào)函數(shù)中對被調(diào)用的函數(shù)作聲明(declaration)。聲明的作用是把函數(shù)名、函數(shù)參數(shù)的個數(shù)和參數(shù)類型等信息通知編譯系統(tǒng),以便在遇到函數(shù)調(diào)用時,編譯系統(tǒng)能正確識別函數(shù)并檢查調(diào)用是否合法。

3.6函數(shù)的嵌套調(diào)用

注意:

C語言的函數(shù)定義是互相平行、獨立的,也就是說,在定義函數(shù)時,一個函數(shù)內(nèi)不能再定義另一個函數(shù),即不能嵌套定義,

但可以嵌套調(diào)用函數(shù),即在調(diào)用一個函數(shù)的過程中,又調(diào)用另一個函數(shù)。

3.7函數(shù)的遞歸調(diào)用

在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。

注意:

程序中不應(yīng)出現(xiàn)無終止的遞歸調(diào)用,而只應(yīng)出現(xiàn)有限次數(shù)的、有終止的遞歸調(diào)用,

這可以用if語句來控制,只有在某一條件成立時才繼續(xù)執(zhí)行遞歸調(diào)用;否則就不再繼續(xù)。

4.數(shù)組作為函數(shù)參數(shù)

4.1.數(shù)組元素作為函數(shù)實參

數(shù)組元素可以用作函數(shù)實參,但是不能用作形參。

因為形參是在函數(shù)被調(diào)用時臨時分配存儲單元的,不可能為一個數(shù)組元素單獨分配存儲單元(數(shù)組是一個整體,在內(nèi)存中占連續(xù)的一段存儲單元)。

在用數(shù)組元素作函數(shù)實參時,把實參的值傳給形參,是“值傳遞”方式。

數(shù)據(jù)傳遞的方向是從實參傳到形參,單向傳遞。

4.2.一維數(shù)組名作函數(shù)參數(shù)

注意:

用數(shù)組元素作實參時,向形參變量傳遞的是數(shù)組元素的值,而用數(shù)組名作函數(shù)實參時,向形參(數(shù)組名或指針變量) 傳遞的是數(shù)組首元素的地址。

一維數(shù)組名作函數(shù)參數(shù)說明:

(1) 用數(shù)組名作函數(shù)參數(shù),應(yīng)該在主調(diào)函數(shù)和被調(diào)用函數(shù)分別定義數(shù)組。

(2) 實參數(shù)組與形參數(shù)組類型必須一致。

(3) 在定義average函數(shù)時,聲明形參數(shù)組的大小為10,但在實際上,指定其大小是不起任何作用的,因為C語言編譯系統(tǒng)并不檢查形參數(shù)組大小,只是將實參數(shù)組的首元素的地址傳給形參數(shù)組名。

(4) 形參數(shù)組可以不指定大小,在定義數(shù)組時在數(shù)組名后面跟一個空的方括號。

4.3.多維數(shù)組名作函數(shù)參數(shù)

可以用多維數(shù)組名作為函數(shù)的實參和形參,在被調(diào)用函數(shù)中對形參數(shù)組定義時可以指定每一維的大小,也可以省略第一維的大小說明。

5.局部變量和全局變量

每一個變量都有一個作用域問題,即它們在什么范圍內(nèi)有效。

5.1局部變量

定義變量可能有3種情況:?

(1) 在函數(shù)的開頭定義;

(2) 在函數(shù)內(nèi)的復(fù)合語句內(nèi)定義;

(3) 在函數(shù)的外部定義。

在一個函數(shù)內(nèi)部定義的變量只在本函數(shù)范圍內(nèi)有效,也就是說只有在本函數(shù)內(nèi)才能引用它們,在此函數(shù)以外是不能使用這些變量的。

在復(fù)合語句內(nèi)定義的變量只在本復(fù)合語句范圍內(nèi)有效,只有在本復(fù)合語句內(nèi)才能引用它們。

在該復(fù)合語句以外是不能使用這些變量的,以上這些稱為“局部變量”。

(1) 主函數(shù)中定義的變量也只在主函數(shù)中有效。主函數(shù)也不能使用其他函數(shù)中定義的變量。

(2) 不同函數(shù)中可以使用同名的變量,它們代表不同的對象,互不干擾。

(3) 形式參數(shù)也是局部變量。只在定義它的函數(shù)中有效。其他函數(shù)中不能直接引用形參。

(4) 在一個函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效,這種復(fù)合語句也稱為“分程序”或“程序塊”。

5.2.全局變量

程序的編譯單位是源程序文件,一個源文件可以包含一個或若干個函數(shù)。

在函數(shù)內(nèi)定義的變量是局部變量,而在函數(shù)之外定義的變量稱為外部變量,外部變量是全局變量(也稱全程變量)。

全局變量可以為本文件中其他函數(shù)所共用。它的有效范圍為從定義變量的位置開始到本源文件結(jié)束。

作用:

設(shè)置全局變量的作用是增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道。

由于同一文件中的所有函數(shù)都能引用全局變量的值,因此如果在一個函數(shù)中改變了全局變量的值,就能影響到其他函數(shù)中全局變量的值。

相當(dāng)于各個函數(shù)間有直接的傳遞通道。由于函數(shù)的調(diào)用只能帶回一個函數(shù)返回值,因此有時可以利用全局變量來增加函數(shù)間的聯(lián)系渠道,通過函數(shù)調(diào)用能得到一個以上的值。

*為了便于區(qū)別全局變量和局部變量,在C程序設(shè)計人員中有一個習(xí)慣(但非規(guī)定),將全局變量名的第1個字母用大寫表示。

但是,建議不在必要時不要使用全局變量,原因如下:

① 全局變量在程序的全部執(zhí)行過程中都占用存儲單元,而不是僅在需要時才開辟單元。

② 它使函數(shù)的通用性降低了,因為如果在函數(shù)中引用了全局變量,那么執(zhí)行情況會受到有關(guān)的外部變量的影響,如果將一個函數(shù)移到另一個文件中,還要考慮把有關(guān)的外部變量及其值一起移過去。但是若該外部變量與其他文件的變量同名時,就會出現(xiàn)問題。這就降低了程序的可靠性和通用性。在程序設(shè)計中,在劃分模塊時要求模塊的“內(nèi)聚性”強、與其他模塊的“耦合性”弱。即模塊的功能要單一(不要把許多互不相干的功能放到一個模塊中),與其他模塊的相互影響要盡量少,而用全局變量是不符合這個原則的。一般要求把C程序中的函數(shù)做成一個相對的封閉體,除了可以通過“實參—形參”的渠道與外界發(fā)生聯(lián)系外,沒有其他渠道。這樣的程序移植性好,可讀性強。

③ 使用全局變量過多,會降低程序的清晰性,人們往往難以清楚地判斷出每個瞬時各個外部變量的值。由于在各個函數(shù)執(zhí)行時都可能改變外部變量的值,程序容易出錯。因此,要限制使用全局變量。

6.變量的存儲方式和生存期

動態(tài)存儲方式與靜態(tài)存儲方式

從變量值存在的時間(即生存期)來觀察,有的變量在程序運行的整個過程都是存在的,而有的變量則是在調(diào)用其所在的函數(shù)時才臨時分配存儲單元,而在函數(shù)調(diào)用結(jié)束后該存儲單元就馬上釋放了,變量不存在了。

也就是說,變量的存儲有兩種不同的方式: 靜態(tài)存儲方式和動態(tài)存儲方式。

靜態(tài)存儲方式是指在程序運行期間由系統(tǒng)分配固定的存儲空間的方式。

動態(tài)存儲方式則是在程序運行期間根據(jù)需要進(jìn)行動態(tài)的分配存儲空間的方式。

7.存儲類別

在C語言中,每一個變量和函數(shù)都有兩個屬性: 數(shù)據(jù)類型和數(shù)據(jù)的存儲類別。

存儲類別指的是數(shù)據(jù)在內(nèi)存中存儲的方式(如靜態(tài)存儲和動態(tài)存儲)。?

在定義和聲明變量和函數(shù)時,一般應(yīng)同時指定其數(shù)據(jù)類型和存儲類別,也可以采用默認(rèn)方式指定(即如果用戶不指定,系統(tǒng)會隱含地指定為某一種存儲類別)。

C的存儲類別包括4種: 自動的(auto)、靜態(tài)的(statis)、寄存器的(register)、外部的(extern)。根據(jù)變量的存儲類別,可以知道變量的作用域和生存期。

7.1.自動變量(auto變量)

(1).函數(shù)中的局部變量,如果不專門聲明為static(靜態(tài))存儲類別,都是動態(tài)地分配存儲空間的,數(shù)據(jù)存儲在動態(tài)存儲區(qū)中。

(2).函數(shù)中的形參和在函數(shù)中定義的局部變量(包括在復(fù)合語句中定義的局部變量),都屬于此類。

(3).在調(diào)用該函數(shù)時,系統(tǒng)會給這些變量分配存儲空間,在函數(shù)調(diào)用結(jié)束時就自動釋放這些存儲空間。

(4).因此這類局部變量稱為自動變量。自動變量用關(guān)鍵字auto作存儲類別的聲明。

實際上,關(guān)鍵字auto可以省略,不寫auto則隱含指定為“自動存儲類別”,它屬于動態(tài)存儲方式。程序中大多數(shù)變量屬于自動變量。

7.2.靜態(tài)局部變量(static局部變量)?

(1) 靜態(tài)局部變量屬于靜態(tài)存儲類別,在靜態(tài)存儲區(qū)內(nèi)分配存儲單元。在程序整個運行期間都不釋放。而自動變量(即動態(tài)局部變量)屬于動態(tài)存儲類別,分配在動態(tài)存儲區(qū)空間而不在靜態(tài)存儲區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。

(2) 對靜態(tài)局部變量是在編譯時賦初值的,即只賦初值一次,在程序運行時它已有初值。以后每次調(diào)用函數(shù)時不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時的值。而對自動變量賦初值,不是在編譯時進(jìn)行的,而是在函數(shù)調(diào)用時進(jìn)行的,每調(diào)用一次函數(shù)重新給一次初值,相當(dāng)于執(zhí)行一次賦值語句。

(3) 如果在定義局部變量時不賦初值的話,則對靜態(tài)局部變量來說,編譯時自動賦初值0(對數(shù)值型變量)或空字符′\0′(對字符變量)。而對自動變量來說,它的值是一個不確定的值。這是由于每次函數(shù)調(diào)用結(jié)束后存儲單元已釋放,下次調(diào)用時又重新另分配存儲單元,而所分配的單元中的內(nèi)容是不可知的。

(4) 雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)是不能引用它的。因為它是局部變量,只能被本函數(shù)引用,而不能被其他函數(shù)引用。

7.3.寄存器變量(register變量)

一般情況下,變量(包括靜態(tài)存儲方式和動態(tài)存儲方式)的值是存放在內(nèi)存中的。當(dāng)程序中用到哪一個變量的值時,由控制器發(fā)出指令將內(nèi)存中該變量的值送到運算器中。 經(jīng)過運算器進(jìn)行運算,如果需要存數(shù),再從運算器將數(shù)據(jù)送到內(nèi)存存放。

如果有一些變量使用頻繁(例如,在一個函數(shù)中執(zhí)行10 000次循環(huán),每次循環(huán)中都要引用某局部變量),則為存取變量的值要花費不少時間。為提高執(zhí)行效率,允許將局部變量的值放在CPU中的寄存器中,需要用時直接從寄存器取出參加運算,不必再到內(nèi)存中去存取。由于對寄存器的存取速度遠(yuǎn)高于對內(nèi)存的存取速度,因此這樣做可以提高執(zhí)行效率。

這種變量叫做寄存器變量,用關(guān)鍵字register作聲明。由于現(xiàn)在的計算機的速度愈來愈快,性能愈來愈高, 優(yōu)化的編譯系統(tǒng)能夠識別使用頻繁的變量,從而自動地將這些變量放在寄存器中,而不需要程序設(shè)計者指定。因此,現(xiàn)在實際上用register聲明變量的必要性不大。


全局變量都是存放在靜態(tài)存儲區(qū)中的。因此它們的生存期是固定的,存在于程序的整個運行過程。

一般來說,外部變量是在函數(shù)的外部定義的全局變量,它的作用域是從變量的定義處開始,到本程序文件的末尾。

在此作用域內(nèi),全局變量可以為程序中各個函數(shù)所引用。但有時程序設(shè)計人員希望能擴展外部變量的作用域。

這就引出了我們的extern關(guān)鍵字。

7.4.外部變量(extern變量)

(1).在一個文件內(nèi)擴展外部變量的作用域

如果外部變量不在文件的開頭定義,其有效的作用范圍只限于定義處到文件結(jié)束。?

在定義點之前的函數(shù)不能引用該外部變量。如果由于某種考慮,在定義點之前的函數(shù)需要引用該外部變量,

則應(yīng)該在引用之前用關(guān)鍵字extern對該變量作“外部變量聲明”,表示把該外部變量的作用域擴展到此位置。

有了此聲明,就可以從“聲明”處起,合法地使用該外部變量。

(2).將外部變量的作用域擴展到其他文件

如果一個程序包含兩個文件,在兩個文件中都要用到同一個外部變量Num,

不能分別在兩個文件中各自定義一個外部變量Num,否則在進(jìn)行程序的連接時會出現(xiàn)“重復(fù)定義”的錯誤。

正確的做法是: 在任一個文件中定義外部變量Num,而在另一文件中用extern對Num作“外部變量聲明”,即“extern Num; ”。

在編譯和連接時,系統(tǒng)會由此知道Num有“外部鏈接”,可以從別處找到已定義的外部變量Num,并將在另一文件中定義的外部變量Num的作用域擴展到本文件,在本文件中可以合法地引用外部變量Num。

extern既可以用來擴展外部變量在本文件中的作用域,又可以使外部變量的作用域從一個文件擴展到程序中的其他文件,系統(tǒng)在編譯過程中遇到extern時,

先在本文件中找外部變量的定義,如果找到,就在本文件中擴展作用域;

如果找不到,就在連接時從其他文件中找外部變量的定義。如果從其他文件中找到了,就將作用域擴展到本文件;

如果再找不到,就按出錯處理。

8.內(nèi)部函數(shù)和外部函數(shù)

函數(shù)本質(zhì)上是全局的,因為定義一個函數(shù)的目的就是要被另外的函數(shù)調(diào)用。

如果不加聲明的話,一個文件中的函數(shù)既可以被本文件中其他函數(shù)調(diào)用,也可以被其他文件中的函數(shù)調(diào)用。

但是,也可以指定某些函數(shù)不能被其他文件調(diào)用。

根據(jù)函數(shù)能否被其他源文件調(diào)用,將函數(shù)區(qū)分為內(nèi)部函數(shù)和外部函數(shù)。

8.1.內(nèi)部函數(shù)

語法:

static 類型名 函數(shù)名(形參表);?

例如:

static int fun(int a,int b)//表示fun是一個內(nèi)部函數(shù),不能被其他文件調(diào)用

內(nèi)部函數(shù)又稱靜態(tài)函數(shù),因為它是用static聲明的。使用內(nèi)部函數(shù),可以使函數(shù)的作用域只局限于所在文件。這樣,在不同的文件中即使有同名的內(nèi)部函數(shù),也互不干擾,不必?fù)?dān)心所用函數(shù)是否會與其他文件模塊中的函數(shù)同名。

通常把只能由本文件使用的函數(shù)和外部變量放在文件的開頭,前面都冠以static使之局部化,其他文件不能引用。這就提高了程序的可靠性。

8.2.外部函數(shù)

例如:

extern 類型名 函數(shù)名(形參表);?

extern int fun(int a,int b)//表示fun可以被其他文件調(diào)用

使用extern聲明就能夠在本文件中調(diào)用在其他文件中定義的函數(shù),或者說把該函數(shù)的作用域擴展到本文件。

extern聲明的形式就是在函數(shù)原型基礎(chǔ)上加關(guān)鍵字extern。

由于函數(shù)在本質(zhì)上是外部的,在程序中經(jīng)常要調(diào)用其他文件中的外部函數(shù),為方便編程,C語言允許在聲明函數(shù)時省寫extern。

用函數(shù)原型能夠把函數(shù)的作用域擴展到定義該函數(shù)的文件之外(不必使用extern)。

只要在使用該函數(shù)的每一個文件中包含該函數(shù)的函數(shù)原型即可。函數(shù)原型通知編譯系統(tǒng): 該函數(shù)在本文件中稍后定義,或在另一文件中定義。

利用函數(shù)原型擴展函數(shù)作用域最常見的例子是#include指令的應(yīng)用。在#include指令所指定的“頭文件”中包含調(diào)用庫函數(shù)時所需的信息。




第七章完!



【回顧】C程序設(shè)計第七章筆記的評論 (共 條)

分享到微博請遵守國家法律
荥经县| 杂多县| 和平县| 通海县| 贺兰县| 江油市| 锦州市| 大英县| 交城县| 巍山| 景泰县| 清涧县| 锡林郭勒盟| 沧州市| 东源县| 伊川县| 望都县| 贺州市| 武义县| 金川县| 水城县| 都匀市| 鹤岗市| 靖安县| 武鸣县| 大渡口区| 杨浦区| 河津市| 德钦县| 闻喜县| 屏南县| 黔东| 金沙县| 婺源县| 定西市| 商城县| 雅江县| 绥中县| 邢台县| 阳城县| 黄龙县|