函數在記憶體中佔用連續區域,函數名在表達式中轉換為該區域首地址(入口地址)。將此地址賦予指標變數,即可透過指標尋找並呼叫函數,這就是函數指標。
回傳類型 (*指標名)(參數列表);
() 優先級高於 *,第一組括號不可省略,否則變成回傳指標的函數宣告。#include <stdio.h>
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
int x, y, maxval;
int (*pmax)(int, int) = max; // 也可寫 int (*pmax)(int a, int b)
printf("Input two numbers: ");
scanf("%d %d", &x, &y);
maxval = (*pmax)(x, y); // 呼叫語法:*指標(實參)
printf("Max value: %d\n", maxval);
return 0;
}
關鍵點: (*pmax)(x, y) 中括號不可少,因 () 優先級高於 *。
qsort 比較函數參數。dlopen/GetProcAddress 取得函數地址後轉型呼叫。函數指標是 C 語言實現多態、事件驅動、插件架構的基石。