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

C語言函數指標完整指南:宣告、呼叫與回呼實戰範例

     編輯:關於C語言

函數指標是 C 語言進階程式設計的核心技術之一,它允許將函數視為資料,實現回呼、動態派發、外掛架構等靈活機制。本文從語法基礎出發,透過完整範例示範函數指標的宣告、賦值、呼叫慣用寫法,並解析其在回呼模式中的實戰應用。

函數指標語法速查

宣告一個指向「接受兩個 int、回傳 int」函數的指標:

int (*funcPtr)(int, int);

關鍵點:

  • 括號不可省略:int *funcPtr(int, int) 會被視為函數宣告。
  • 函數名稱本身即代表函數位址,可直接賦值給同型別指標。

完整可執行範例:策略模式雛形

#include <stdio.h>

// 兩個具體演算法
int sum(int a, int b) { return a + b; }
int minus(int a, int b) { return a - b; }

// 高階函數:接受函數指標作為參數
int calculate(int a, int b, int (*op)(int, int)) {
    return op(a, b);  // 也可寫成 (*op)(a, b)
}

int main() {
    printf("%d\n", calculate(10, 10, sum));   // 輸出 20
    printf("%d\n", calculate(10, 10, minus)); // 輸出 0
    return 0;
}

程式碼解析

  1. sum / minus:兩個同原型函數,分別實作加法與減法邏輯。
  2. calculate:第三個參數 int (*op)(int, int) 接受函數指標,內部直接呼叫 op(a, b) 執行傳入的演算法。
  3. main:分別傳入 sum、minus,展現「同一介面、不同行為」的多型效果。

進階應用場景

場景說明
回呼函數庫函數(如 qsort、訊號處理)需使用者提供比較/處理邏輯時。
狀態機以函數指標陣列對應各狀態處理函數,透過索引快速切換。
外掛/擴充架構主程式載入動態庫,取得函數位址存入指標表,實現熱插拔。
物件導向模擬結構體內嵌函數指標模擬虛函數表,實現單繼承多型。

常見錯誤與避坑指南

  • 型別不符:參數數量、型別、回傳值必須完全一致,否則會產生未定義行為。
  • 呼叫慣例不匹配:Windows API 常用 __stdcall,若指標宣告缺少呼叫慣例修飾詞會導致堆疊破壞。
  • 空指標呼叫:使用前務必檢查指標是否為 NULL。

總結

函數指標將「程式碼」變為「資料」,打破靜態呼叫的限制,是 C 語言實現高階抽象的關鍵鑰匙。熟練掌握其宣告、賦值、呼叫三部曲,並理解回呼模式精髓,能大幅擴展程式設計的表達能力。

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