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

C語言跳轉表實戰:以函數指針陣列實現高效分派

     編輯:關於C

為什麼需要跳轉表?

當面對「根據輸入選項執行對應操作」且選項範圍可控時,switch-case 或 if-else 鏈會隨選項增多而降低可讀性與效率。跳轉表(轉移表)將函數指針存入陣列,以選項為索引直接調用,實現 O(1) 分派,且程式碼極其簡潔。

核心實現模式

// 1. 定義函數指針陣列(跳轉表)
int (*oper_func[])(int, int) = { add, sub, mul, div };

// 2. 選項與索引映射表
char oper_sequence[4][10] = { "add", "sub", "mul", "div" };

// 3. 運行時查找索引並調用
int seq = find_index(user_input, oper_sequence, 4);
result = oper_func[seq](a, b);

完整可執行範例:四則運算分派器

#include <stdio.h>
#include <string.h>

#define M 4

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int div(int a, int b) { return a / b; }

// 跳轉表:函數指針陣列
int (*oper_func[])(int, int) = { add, sub, mul, div };
char oper_sequence[M][10] = { "add", "sub", "mul", "div" };

int main() {
    char oper[10];
    int a, b, seq = -1;
    
    printf("Operator: "); scanf("%s", oper);
    printf("a: "); scanf("%d", &a);
    printf("b: "); scanf("%d", &b);
    
    for (int i = 0; i < M; i++) {
        if (strncmp(oper_sequence[i], oper, 3) == 0) { seq = i; break; }
    }
    
    if (seq != -1) {
        printf("result is %d\n", oper_func[seq](a, b));
    } else {
        printf("Unknown operator\n");
    }
    return 0;
}

進階技巧與變體

  • 預設分支:在陣列末尾加入 default_handler,索引超界時自動落入
  • 稀疏索引壓縮:選項非連續時,先建立 選項值→索引 的映射表(如雜湊表或二分查找陣列)
  • 狀態機驅動:結合狀態與事件雙維度表,實現複雜協議解析器
  • 編譯期計算:配合 C99 指定初始化子 [OP_ADD] = add 避免手動維護順序

效能與適用場景對比

方案時間複雜度維護性適用場景
if-else 鏈O(n)差選項少、條件複雜
switch-caseO(1)~O(n)中整數連續選項
跳轉表O(1)優固定集合、高頻調用、需動態擴展
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved