函數指針是指向函數代碼入口地址的指針變量。通過函數指針可以實現回調機制、動態綁定、策略模式等高級編程技巧。本範例以「求兩數最大值」為例,演示函數指針的聲明、賦值與調用全過程。
#include <stdio.h>
// 目標函數:返回兩整數中的最大值
int max(int a, int b) {
return (a > b) ? a : b;
}
int main() {
// 1. 聲明函數指針:指向「接受兩個int,返回int」的函數
int (*func_ptr)(int, int);
// 2. 賦值:將 max 函數地址賦給指針(函數名即地址)
func_ptr = max;
int a, b, result;
printf("請輸入兩個整數(空格分隔): ");
if (scanf("%d %d", &a, &b) == 2) {
// 3. 通過指針調用函數(兩種等價寫法)
// result = (*func_ptr)(a, b); // 顯式解引用
result = func_ptr(a, b); // 隱式調用(C99標準推薦)
printf("最大值 = %d\n", result);
} else {
printf("輸入格式錯誤!\n");
}
return 0;
}
int (*func_ptr)(int, int);
int:返回值類型(*func_ptr):*表示指針,括號提升優先級,func_ptr是變量名(int, int):參數列表類型易錯點:若寫成int *func_ptr(int, int),則聲明的是一個返回指針的函數,而非函數指針。
func_ptr = max; 或 func_ptr = &max;(取地址符可省略)func_ptr(a, b)(現代風格)或 (*func_ptr)(a, b)(傳統風格)void sort(int *arr, int n, int (*cmp)(int, int)) {
// 根據 cmp 策略排序(升序/降序/自定義規則)
}
typedef void (*EventHandler)(int event_id);
EventHandler handlers[MAX_EVENTS];
// 動態註冊不同事件處理器
主程序通過函數指針表調用動態庫導出的函數,實現模塊解耦。
函數指針是C語言實現多態與動態行為的核心機制。掌握其聲明語法、賦值規則及調用方式,對於閱讀系統級代碼(如Linux內核、嵌入式框架)至關重要。建議練習實現一個簡單的計算器,通過函數指針數組管理+ - * /四則運算,深化理解。