首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言 typedef 定義函數指標類型完全指南

     編輯:關於C語言

基本語法:以函數指標為例

// 定義一個函數指標類型:接受兩個 int 參數,回傳 int
typedef int (*MYFunc)(int x, int y);

// 等價於:int (*MYFunc)(int, int);
// MYFunc 現在是「指向函數的指標」的類型別名

逐層拆解理解技巧

若覺得複雜,可分步驟理解:

  1. 去掉參數列表:typedef int (*MYFunc); → MYFunc 是 int* (指向 int 的指標)
  2. 加回參數列表: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 = &func

C 標準規定:函數設計子在表達式中 (除 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; 避免野指標。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved