一、函數概述
函數是面向過程編程思想的具體體現,主要作用:
降低程序之間的耦合性
提高代碼的復用性和可維護性
一個完整的 C 程序由**一個或多個程序模塊(源文件)**組成。為便于開發與調試,通常會將代碼拆分為多個源文件,并組合成一個整體程序。
每個源文件是一個編譯單位,即 C 編譯器以“源文件”為單位進行編譯。
程序從
main()
函數開始執行,調用其他函數后,執行完再返回到main()
,最終在main()
結束程序運行。
二、函數的基本結構
函數定義包括兩部分:
1. 函數頭(首部)
類型說明符 函數名(形式參數列表)
2. 函數體
{ 聲明部分; 語句部分; }
示例
int add(int a, int b)
{
? ? return a + b;
}
int
:函數返回類型add
:函數名(int a, int b)
:形式參數{}
:函數體
三、函數的類型與約束
返回類型:可以是除數組以外的任意類型(包括
void
)return:
如果返回類型是
void
,則不能返回值;返回值類型必須與定義一致或可隱式轉換;
不寫返回類型默認是
int
限制:
函數不能嵌套定義
函數之間可以互相調用,包括嵌套調用
四、函數的調用
基本語法:
函數名(實際參數);
示例:
int result = add(3, 5); // 實參傳入 3 和 5
調用規則:
實參與形參數量必須一致,類型要匹配或可自動轉換;
實參與形參名稱可相同,但屬于不同作用域;
函數必須先聲明或定義,否則無法調用;
函數嵌套調用示例:
int add(int a, int b) {
return a + b;
}int square(int x) {
return x * x;
}int main() {
int result = square(add(2, 3));
printf("%d\n", result); // 輸出 25
return 0;
}
五、函數調用注意事項
值傳遞:函數傳參是值傳遞,傳的是副本,不影響原變量;
參數計算順序:從右向左
fun(i++, i++, i++); // 實際執行順序為從右向左
不要在一次調用中對同一變量進行多次自增/自減,可能導致結果不可預測。
C 語言不支持函數重載,即函數不能重名。
六、return 語句說明
return
可終止當前函數并返回值(或不返回)返回值類型應與函數聲明一致
七、函數的種類
1. 標準庫函數
如:printf
、scanf
、strlen
、strcmp
、strcpy
等
系統提供,無需自定義
不同編譯器支持的庫函數數量可能不同
2. 用戶自定義函數
用戶根據需要自定義
提高模塊化和代碼復用能力
八、C 語言內存的五大分區
1. 棧區(Stack)
系統自動分配和釋放
用于存儲局部變量、函數調用返回地址等
遵循 FILO 原則(先進后出)
Linux 棧約 8MB,Windows 棧通常 <1MB
2. 堆區(Heap)
需要程序員手動申請(如
malloc
)和釋放(如free
)生命周期由程序員控制
3. 靜態區(全局區)
存儲全局變量和靜態變量
生命周期貫穿整個程序執行周期
4. 字符串常量區
存儲由雙引號括起來的字符串常量
單引號(如
'A'
)表示字符常量,不屬于此區
5. 代碼區(text segment)
存放程序編譯生成的機器指令
是只讀區域,防止代碼被誤修改