在 C 語言中,指標不僅能指向變數、陣列,還能指向函數。函數指標就是指向函數的指標。函數名實際上代表該函數在記憶體中的起始位址。利用函數指標,我們可以將函數位址傳遞給其他函數,也可以從函數返回函數指標,實現靈活的回調與動態調用機制。
宣告一個函數指標的語法如下:
返回類型 (*指標名)(參數列表);
例如:int (*fun)(int, int); 宣告了一個指向「接受兩個 int 參數並返回 int」函數的指標 fun。
#include <stdio.h>
int sum(int a, int b); // 函數宣告
int main() {
int a, b;
int (*fun)(int, int); // 宣告函數指標
printf("請輸入兩個整數:");
scanf("%d,%d", &a, &b);
// 方式一:直接使用函數名呼叫
printf("第一種呼叫方式:函數名呼叫求和函數:\n");
printf("%d+%d=%d\n", a, b, sum(a, b));
// 方式二:使用函數指標呼叫
fun = sum; // 讓 fun 指向 sum 函數
printf("第二種呼叫方式:函數指標呼叫求和函數:\n");
printf("%d+%d=%d\n", a, b, (*fun)(a, b)); // 也可寫成 fun(a, b)
return 0;
}
int sum(int m, int n) {
return m + n;
}
fun = sum;:函數名 sum 會隱式轉換為函數位址,賦值給指標 fun。(*fun)(a, b):解參考指標並呼叫函數,等價於 fun(a, b),因為函數指標在呼叫時會自動轉換。函數指標常用於:回調函數、狀態機實現、排序函數(如 qsort 的比較器)、動態載入庫函數等,是 C 語言實現多態與模組化設計的核心工具之一。