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

C 語言指標進階:函式指標、回呼與邏輯演算法分離

     編輯:關於C語言

回傳指標的函式

語法:型別 *函式名(參數表)。例:int* func(int x, int y) 回傳指向 int 的指標。注意 * 僅修飾回傳型別,非函式名一部分。

函式指標:將函式當作資料傳遞

存在理由

函式在記憶體佔有儲存區,有起始位址(入口點)。函式指標儲存此位址,使函式可被間接呼叫、作為參數傳遞、儲存於陣列/結構中。

宣告語法

int (*p)();           // 指向無參、回傳 int 的函式
int (*p)(int, int);   // 指向雙 int 參、回傳 int 的函式

括號不可省:int *p() 會被解析為「回傳 int* 的函式 p」。

直接呼叫 vs 間接呼叫

  • 直接:Max(2,9)
  • 間接:p = Max; p(2,9) 或 (*p)(2,9)

除錯器視角:函式指標的跳躍表

除錯器顯示 p 與 Max 位址不同 反組譯顯示 JMP 跳躍表

Debug 模式下,編譯器為函式指標產生跳躍表(JMP 指令),導致指標值非直接函式位址。Release 模式通常優化為直接位址。

函式指標型別轉換陷阱

int (*p)(int) = (int (*)(int))Max; // 強制雙參轉單參(危險!)
int a = ((int (*)(int, int))p)(2, 9); // 呼叫時再轉回

型別轉換雖可通過編譯,但參數不匹配會導致未定義行為,實務上應避免。

邏輯與演算法分離:策略模式雛形

邏輯與演算法分離示意

透過函式指標將「比較演算法」參數化:

void Sort(void* base, size_t n, size_t sz, int (*cmp)(const void*, const void*)) {
    // 排序邏輯固定,比較策略由 cmp 決定
}

呼叫端可傳入不同比較函式(升序、降序、自訂鍵值),實現演算法與業務邏輯解耦。這是 C 語言實現「策略模式」的核心技術,也是 qsort、bsearch 等標準庫函式的設計基石。

注意事項

  • 函式指標不支援算術運算(+/- 無意義)。
  • 嚴格匹配參數型別與數量,避免強制轉型。
  • 善用 typedef 簡化複雜宣告:typedef int (*CmpFunc)(const void*, const void*);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved