函數是 C 程序的基本組成單元。本文通過完整示例,系統講解函數定義、聲明、調用、參數傳遞(值傳遞/地址傳遞)、返回值、聲明與定義順序,以及局部/全局變數的作用域與生命週期。
// 無參無返回
void func1() { ... }
// 有參有返回
float average(float scores[], int n) {
float sum = 0;
for (int i=0; i
2. 完整示例:計算班級平均分
#include
float average(float scores[], int n); // 函數聲明
int main() {
float scores[20], avg;
int n, i;
printf("輸入班級人數: ");
scanf("%d", &n);
printf("輸入 %d 個分數:\n", n);
for (i=0; i

3. 核心知識點
參數傳遞
方式 機制 示例 影響
值傳遞 形參獲得實參的副本 int n → int m函數內修改形參不影響實參
地址傳遞 形參獲得實參的地址 float a[] → float b[]函數內修改數組元素影響原數組
本質上 C 只有值傳遞,「地址傳遞」是通過傳遞指針值(地址)實現的間接修改。
返回值
return 只能返回單個值。
- 返回表達式類型與函數聲明類型不一致時,隱式轉換為聲明類型。
- 若函數聲明類型為
int,返回類型可省略(舊標準),現代建議顯式聲明。
函數聲明
- 遵循「先聲明/定義,後使用」原則。
- 若定義在
main 之前,可省略聲明;否則必須聲明,否則編譯器假定返回 int 導致錯誤。
4. 變數作用域與生命週期
int m, n; // 全局變數:文件級作用域,程序啟動~結束
double fun(int x, int y) {
int m, n; // 局部變數:塊級作用域(函數體),遮蔽全局 m,n
...
}
int main() {
int a, b; // 局部變數:main 塊級作用域
if (cond) {
int x, y; // 局部變數:if 塊級作用域,出 if 即銷毀
}
}
規則總結
- 局部變數:僅在定義它的代碼塊內可見,塊結束自動銷毀(棧分配)。
- 全局變數:在整個文件(或經
extern 聲明後跨文件)可見,靜態存儲區,程序全生命週期存在。
- 同名遮蔽:局部變數與全局變數同名時,局部優先(就近原則)。
5. 避坑指南
- 數組作為參數時退化為指針,
sizeof(scores) 在函數內得到的是指針大小,而非數組大小 → 必須額外傳遞長度參數。
- 不要返回局部變數的地址(懸垂指針)。
- 全局變數盡量少用,改用參數傳遞或靜態局部變數,降低耦合。
掌握函數調用棧幀、參數壓棧、作用域鏈機制,是從「能寫代碼」進階到「寫出健壯代碼」的關鍵。