函數指標是 C 語言進階程式設計的核心技術之一,它允許將函數視為資料,實現回呼、動態派發、外掛架構等靈活機制。本文從語法基礎出發,透過完整範例示範函數指標的宣告、賦值、呼叫慣用寫法,並解析其在回呼模式中的實戰應用。
宣告一個指向「接受兩個 int、回傳 int」函數的指標:
int (*funcPtr)(int, int);
關鍵點:
int *funcPtr(int, int) 會被視為函數宣告。#include <stdio.h>
// 兩個具體演算法
int sum(int a, int b) { return a + b; }
int minus(int a, int b) { return a - b; }
// 高階函數:接受函數指標作為參數
int calculate(int a, int b, int (*op)(int, int)) {
return op(a, b); // 也可寫成 (*op)(a, b)
}
int main() {
printf("%d\n", calculate(10, 10, sum)); // 輸出 20
printf("%d\n", calculate(10, 10, minus)); // 輸出 0
return 0;
}
int (*op)(int, int) 接受函數指標,內部直接呼叫 op(a, b) 執行傳入的演算法。sum、minus,展現「同一介面、不同行為」的多型效果。| 場景 | 說明 |
|---|---|
| 回呼函數 | 庫函數(如 qsort、訊號處理)需使用者提供比較/處理邏輯時。 |
| 狀態機 | 以函數指標陣列對應各狀態處理函數,透過索引快速切換。 |
| 外掛/擴充架構 | 主程式載入動態庫,取得函數位址存入指標表,實現熱插拔。 |
| 物件導向模擬 | 結構體內嵌函數指標模擬虛函數表,實現單繼承多型。 |
__stdcall,若指標宣告缺少呼叫慣例修飾詞會導致堆疊破壞。NULL。函數指標將「程式碼」變為「資料」,打破靜態呼叫的限制,是 C 語言實現高階抽象的關鍵鑰匙。熟練掌握其宣告、賦值、呼叫三部曲,並理解回呼模式精髓,能大幅擴展程式設計的表達能力。