函數指針是指向函數代碼入口地址的指針變量。它允許在運行時動態決定調用哪個函數,是實現回調、狀態機、插件架構的核心機制。
典型語法:
typedef void (*pSimulatepks)(uint8_t *prxBuf, uint8_t *prxBufLen);
pSimulatepks 是類型別名,代表「指向參數為兩個 uint8_t*、返回 void 的函數」的指針類型。(*pSimulatepks) 聲明這是一個指針;第二組括號是函數參數列表。定義變量:
pSimulatepks pfun; // 現在 pfun 可以指向任意匹配簽名的函數
假設有目標函數:
void fun(uint8_t *prxBuf, uint8_t *prxBufLen) { /* ... */ }
賦值:
pfun = fun; // 隱式取地址
pfun = &fun; // 顯式取地址,效果相同
調用(兩種等價寫法):
pfun(rxBuf, &rxBufLen); // 直接調用
(*pfun)(rxBuf, &rxBufLen); // 顯式解引用調用
根據命令碼返回不同的處理函數:
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);
這實現了簡單的策略模式:根據輸入動態選擇算法。
typedef int (*OpFunc)(int, int);
OpFunc ops[] = {add, sub, mul, div};
int result = ops[opCode](a, b);
int cmp(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
qsort(arr, n, sizeof(int), cmp);
函數指針是 C 語言實現多態、回調、動態分發的基石。掌握其聲明語法、賦值調用規則,並結合 typedef 簡化複雜類型,能顯著提升代碼的靈活性與可擴展性。