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

C 語言函數指針完全指南:定義、調用與回調實戰

     編輯:關於C++

什麼是函數指針?

函數指針是指向函數代碼入口地址的指針變量。它允許在運行時動態決定調用哪個函數,是實現回調、狀態機、插件架構的核心機制。

1. 函數指針的定義與聲明

典型語法:

typedef void (*pSimulatepks)(uint8_t *prxBuf, uint8_t *prxBufLen);
  • pSimulatepks 是類型別名,代表「指向參數為兩個 uint8_t*、返回 void 的函數」的指針類型。
  • 第一組括號 (*pSimulatepks) 聲明這是一個指針;第二組括號是函數參數列表。

定義變量:

pSimulatepks pfun;  // 現在 pfun 可以指向任意匹配簽名的函數

2. 函數指針的賦值與調用

假設有目標函數:

void fun(uint8_t *prxBuf, uint8_t *prxBufLen) { /* ... */ }

賦值:

pfun = fun;          // 隱式取地址
pfun = &fun;         // 顯式取地址,效果相同

調用(兩種等價寫法):

pfun(rxBuf, &rxBufLen);      // 直接調用
(*pfun)(rxBuf, &rxBufLen);   // 顯式解引用調用

3. 函數指針作為返回值:工廠模式雛形

根據命令碼返回不同的處理函數:

pSimulatepks simFunc(uint8_t cmd) {
    switch(cmd) {
        case 0x01: return sim_a;
        case 0x02: return sim_b;
        case 0x03: return sim_c;
        case 0x04: return sim_d;
        default:   return NULL;
    }
}

調用端:

pSimulatepks handler = simFunc(cmd);
if (handler) handler(buf, &len);

這實現了簡單的策略模式:根據輸入動態選擇算法。

4. 進階技巧與避坑指南

指向不同簽名函數的指針數組

typedef int (*OpFunc)(int, int);
OpFunc ops[] = {add, sub, mul, div};
int result = ops[opCode](a, b);

回調函數的典型應用:qsort 比較器

int cmp(const void *a, const void *b) {
    return *(int*)a - *(int*)b;
}
qsort(arr, n, sizeof(int), cmp);

常見錯誤

  • 參數類型不匹配:嚴格遵循函數簽名,否則導致未定義行為。
  • 未初始化就調用:調用前務必確保指針非 NULL。
  • 混淆函數指針與數據指針:不可互相轉換(C 標準不保證)。

總結

函數指針是 C 語言實現多態、回調、動態分發的基石。掌握其聲明語法、賦值調用規則,並結合 typedef 簡化複雜類型,能顯著提升代碼的靈活性與可擴展性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved