// 定義一個函數指標類型:接受兩個 int 參數,回傳 int
typedef int (*MYFunc)(int x, int y);
// 等價於:int (*MYFunc)(int, int);
// MYFunc 現在是「指向函數的指標」的類型別名
若覺得複雜,可分步驟理解:
typedef int (*MYFunc); → MYFunc 是 int* (指向 int 的指標)typedef int (*MYFunc)(int, int); → MYFunc 是「接受兩個 int、回傳 int 的函數指標」int add(int x, int y) { return x + y; }
MYFunc pMYFunc; // 宣告函數指標變數
pMYFunc = add; // 隱式取址:函數名自動轉換為函數指標
// pMYFunc = &add; // 顯式取址,效果相同
int result = pMYFunc(5, 6); // 透過指標呼叫函數,結果為 11
p = func ≡ p = &funcC 標準規定:函數設計子在表達式中 (除 sizeof、& 操作元外) 自動轉換為指向該函數的指標。因此賦值給函數指標變數時,& 可加可不加,編譯器產生相同機器碼。
// 狀態處理函數類型
typedef void (*StateHandler)(void *context);
// 狀態表
StateHandler state_table[] = {
handle_idle,
handle_running,
handle_paused,
handle_error
};
// 執行狀態機
void run_state_machine(int state, void *ctx) {
if (state >= 0 && state < sizeof(state_table)/sizeof(state_table[0])) {
state_table[state](ctx);
}
}
void* 無法合法儲存函數指標 (架構依賴,可能大小不同)。typedef void (*CB)(int); 無法指向 void f(long),即使 int 隱式轉 long 也不行。stddef.h 使用 NULL 初始化:MYFunc fp = NULL; 避免野指標。