在結構化程式設計中,函數是構建軟體系統的核心基石。透過「自頂向下、逐步求精、模組化」的原則,將複雜系統分解為獨立功能模組,每個函數專責特定資料處理,最終由主函數串聯起整個程式流程。本文將系統梳理 C 語言函數的定義、參數傳遞、遞歸、陣列應用、變數作用域與儲存類別等關鍵知識點。
C 程式由一個主函數 main() 與若干子函數組成。函數定義通式包含類型指定符、函數名、參數列表、宣告區與敘述區。依參數與返回值特性,主要分為三類:
C 採用值傳遞機制:實參(常數、變數、運算式)的值複製給形參,單向流動,形參變更不影響實參。關鍵規則包括:
return 取得;若類型不匹配,以函數定義類型為準。void 宣告。巢狀調用:函數間平行定義,但可互相調用形成呼叫鏈。例如用截距法求解方程根,主函數呼叫 root(),後者再呼叫 xpoint() 與 f(),層層遞進完成計算。
遞歸調用:函數直接或間接呼叫自身。經典案例為階乘計算:
float fact(int n) {
if (n < 0) printf("error");
else if (n == 0 || n == 1) return 1;
else return fact(n - 1) * n;
}
遞歸需明確終止條件(如 n==1),否則導致無限遞歸棧溢位。
陣列名作參數時,實際傳遞的是首元素位址,形參與實參共享同一記憶體區塊。注意事項:
float a[10] 與 float a[] 等價。| 類別 | 關鍵字 | 儲存區 | 生命週期 | 作用域 | 預設初值 |
|---|---|---|---|---|---|
| 自動變數 | auto | 動態區(棧) | 函數執行期間 | 區塊內 | 不定值 |
| 靜態區域變數 | static | 靜態區 | 程式全程 | 區塊內 | 0/NULL |
| 暫存器變數 | register | CPU 暫存器 | 函數執行期間 | 區塊內 | 不定值 |
| 外部變數 | extern | 靜態區 | 程式全程 | 全域(跨檔案需聲明) | 0 |
| 靜態外部變數 | static | 靜態區 | 程式全程 | 僅限本檔案 | 0 |
關鍵差異:static 修飾區域變數可保持值跨越呼叫;register 建議編譯器優化存取速度,但受硬體暫存器數量限制;extern 擴展跨檔案可見性;檔案級 static 限制符號僅在編譯單元內可見,避免多檔案專案符號衝突。
函數預設為 extern(外部函數),可跨檔案調用。若在定義前加 static 成為內部函數(靜態函數),僅限本檔案可見,不同檔案可同名不衝突。跨檔案調用外部函數時,需在調用檔案以 extern 聲明。
掌握函數機制是編寫模組化、可維護 C 程式的基石。合理劃分功能、善用遞歸與靜態儲存、嚴控變數作用域,能顯著提升程式碼品質與效能。