第 7 章 用函式實現模組化程式設計
第 7 章 用函式實現模組化程式設計
7.1 為什麼要用函式
函式就是功能,每一個函式用來實現一個特定的功能。
在設計一個較大的程式時,往往採用模組化程式設計的思路,把它分成若干個程式模組,每一個模組包括一個或多個函式每個函式實現一個特定的功能。一個 C 程式可由一個主函式和若干其它函式構成。
說明:
- 一個 C 程式由一個或多個程式模組組成,每一個程式模組作為一個源程式檔案。
- 一個源程式檔案由一個或多個函式以及其他有關內容(如指令、資料宣告與定義等)組成。一個源程式檔案是一個編譯單位。
- C 程式的執行是從 main 函式開始的,也是在 main 函式中結束整個程式的執行。
- 函式定義是獨立的。函式間可以互相呼叫,但不能呼叫 main 函式。
- 從使用者使用的角度看,函式包括庫函式和使用者自定義函式兩種。
- 從函式的形式看,函式分為無參函式和有參函式兩類。
7.2 怎樣定義函式
7.2.1 為什麼要定義函式
C 語言要求函式必須先定義後使用。
函式定義要包括函式名、函式型別、函式引數名和引數型別以及函式功能(函式體)。
7.2.2 定義函式的方法
1. 定義無參函式
定義無參函式的一般形式為:
型別名 函式名(void)
{
函式體
}
括號內的 void 表示函式沒有引數,void 可省略。
2. 定義有參函式
定義有參函式的一般形式為:
型別名 函式名(形式引數列表)
{
函式體
}
若函式體為空,則稱為空函式。
7.3 呼叫函式
7.3.1 函式呼叫的形式
函式呼叫的一般形式為:
函式名(實參列表)
若呼叫無參函式,則實參列表可以沒有。
7.3.2 函式呼叫時的資料傳遞
1. 形式引數和實際引數
在呼叫有參函式時,主調函式和被調函式之間有資料傳遞關係。定義函式時的引數稱為形式引數(形參),呼叫函式時的引數稱為實際引數(實參)。
2. 實參和形參間的資料傳遞
在呼叫函式過程中,系統會把實參的值傳遞給被呼叫函式的形參。形參的值僅在呼叫期間有效。
說明:
- 實參可以時常量、變數或表示式。
- 實參和形參的型別應該保證賦值相容。
7.3.3 函式呼叫的過程
- 定義函式中指定的形參在未發生函式呼叫時並不佔用記憶體中的儲存單元。在發生函式呼叫時,函式的形參才被臨時分配記憶體單元。
- 在發生函式呼叫時,將實參的值傳遞給對應形參。
- 在函式呼叫期間,形參的值參與有關運算。
- 通過 return 語句將函式值返回給主調函式。函式返回值的型別要與函式型別一致。如果沒有返回值,則函式的型別應定義為 void。
- 函式呼叫結束後,形參單元被釋放。實參單元保留不變。實參和形參是兩個不同的儲存單元。
注意:實參向形參的資料傳遞時值傳遞,只能由實參傳給形參。實參和形參在記憶體中佔用不同的儲存單元。
7.3.4 函式的返回值
通過函式呼叫可以得到一個函式值(函式返回值)。
說明:
- 函式的返回值是通過函式中的 return 語句獲得的。
- 如果函式有返回值,定義函式時要指定函式值的型別。
- 函式型別決定函式返回值的型別,可以自動進行型別轉換。
- 對於不帶返回值的函式,定義函式為“void 型別”。
7.4 對被呼叫函式的宣告和函式原型
- 被呼叫的函式必須是已經定義的函式。
- 呼叫庫函式要用
#include
指令引用有關標頭檔案。 - 呼叫使用者自定義函式要在主調函式中對被呼叫的函式作宣告。
函式首部稱為函式原型,使用函式首部進行函式宣告。函式首部包含了函式名、函式型別、引數個數和引數順序,從而可以對函式呼叫的合法性進行檢查。
函式宣告的一般形式有兩種:
函式型別 函式名(引數型別 1 引數名 1, ..., 引數型別 n 引數名 n);
函式型別 函式名(引數型別 1, ..., 引數型別 n);
函式宣告中可以省略形參名。
注意:函式的定義是指對函式功能的確立,包括函式名、函式值型別、形參及其型別以及函式體。函式宣告的作用是將函式的名字、函式型別以及形參的型別、個數和順序通知編譯系統,以便在呼叫時進行檢查,它不包括函式體。
7.5 函式的巢狀呼叫
C 語言的函式不能巢狀定義,但可以巢狀呼叫,即在呼叫一個函式的過程中,又呼叫另一個函式。
7.6 函式的遞迴呼叫
在呼叫一個函式的過程中直接或間接的呼叫函式本身,稱為函式的遞迴呼叫。
程式中不應出現無終止的遞迴呼叫,而應是有限次數的、有終止的遞迴呼叫。