函數在內存中佔據一塊代碼區,其入口地址即為函數指針。定義一個指針變量指向該地址,即可通過指針調用函數,實現動態綁定與回調。
返回類型 (*指針名)(參數列表);
例如:
int (*p)(); — 指向無參、返回 int 的函數float (*q)(float, int); — 指向接受 float,int 並返回 float 的函數#include <cstdio>
int arr_add(int (*arr)[4], int n, int m) {
int sum = 0;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j) sum += arr[i][j];
return sum;
}
int main() {
int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}};
int (*pt)(int(*)[4], int, int) = arr_add; // 指針指向函數
printf("直接調用: %d\n", arr_add(a, 3, 4));
printf("指針調用: %d\n", (*pt)(a, 3, 4)); // 解引用調用
return 0;
}
void process(int (*func)(int), int val) {
printf("結果: %d\n", func(val));
}
int square(int x) { return x * x; }
int cube(int x) { return x * x * x; }
int main() {
process(square, 5); // 輸出 25
process(cube, 3); // 輸出 27
}
*pt 和 pt 效果相同,編譯器自動解引用函數指針是 C/C++ 實現多態、事件驅動、插件架構的基石,熟練掌握其聲明與調用語法至關重要。