指向函數入口地址的指針變量,實現靜態綁定(編譯/鏈接時確定目標)。
int add(int a, int b) { return a + b; }
int (*fp)(int, int) = add; // 賦值
int c = fp(2, 4); // 調用
將函數指針作為參數傳遞給另一函數,實現動態綁定(運行時確定具體行為),體現「好萊塢原則」:Don't call us, we'll call you。
int add(int a, int b) { return a + b; } // 回調實現
int executor(int a, int b, int (*fp)(int, int)) { // 中間層
return fp(a, b);
}
int main() {
int c = executor(2, 4, add); // 傳入函數名
printf("%d\n", c);
}
核心特徵:
qsort 比較函數)。用戶態程序請求內核服務的受控接口,涉及特權級切換。
用戶態調用 read()
→ 軟中斷 0x80 (或 syscall/sysenter 指令)
→ 系統調用號傳遞(EAX/RAX)
→ 內核系統調用表查找入口
→ 內核態執行對應處理函數
→ 返回用戶態,恢復上下文
實現機制:
iret/sysret 返回用戶態。| 維度 | 函數指針 | 回調函數 | 系統調用 |
|---|---|---|---|
| 本質 | 代碼地址變量 | 函數指針作參數的調用模式 | 用戶態→內核態受控轉移 |
| 綁定時機 | 靜態(賦值時) | 動態(調用時) | 運行時(中斷向量表) |
| 權限 | 用戶態 | 用戶態 | 跨特權級 |
| 典型用途 | 間接調用、狀態機 | 框架回調、插件、泛型算法 | I/O、進程控制、內存管理 |