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

C 語言函數指標陣列:Linux 核心 socket 結構體中的實戰應用分析

     編輯:C 語言入門

發現:結構體成員即函數指標

Linux 核心 struct proto_ops 大量使用函數指標成員:

struct proto_ops {
    int family;
    struct module *owner;
    int (*release)(struct socket *sock);
    int (*bind)(struct socket *, struct sockaddr *, int);
    // ... 更多操作指標
};

這是 C 語言模擬物件導向多型的經典手法:結構體封裝資料,函數指標封裝行為,不同協議族填入不同函數實現「虛函數表」效果。

C vs C++ 結構體差異

特性C 結構體C++ 結構體/類別
成員函數不支援,改用函數指標支援,含 this 指標
封裝無public/private/protected
繼承/多型手動模擬原生支援

函數指標陣列基本用法

int func1(int n) { printf("func1: %d\n", n); return n; }
int func2(int n) { printf("func2: %d\n", n); return n; }

int main() {
    int (*arr[2])(int) = { func1, func2 };  // 陣列元素為函數指標
    arr[0](1);  // 呼叫 func1
    arr[1](2);  // 呼叫 func2
    return 0;
}

int (*arr[2])(int) 宣告:arr 是陣列,元素型別為「接受 int 回傳 int 的函數指標」。

核心優勢

  • 執行期綁定:可根據配置/狀態動態決定調用哪個函數。
  • 介面統一:相同簽名函數可互換,實現策略模式、狀態機、事件分發。
  • 零開銷抽象:僅一次間接跳轉,效率極高,核心熱路徑廣泛採用。

實戰建議

  1. 使用 typedef 簡化複雜函數指標型別宣告。
  2. 結構體同時包含資料與操作指標,形成「類別」雛形。
  3. 提供預設實現(如 NULL 代表不支援),調用端需檢查非空。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved