函式位於程式碼區,擁有位址。函式名稱即為其起始位址(類似陣列名)。
int test(int a);
int (*fp)(int a); // 函式指標:指向「接受 int、回傳 int」的函式
常見錯誤: int *fp(int a); 宣告的是「回傳 int* 的函式」,非函式指標。括號優先級關鍵。
int test(int a) { return a; }
int main() {
cout << test << endl; // 印出函式位址
int (*fp)(int) = test; // 指派
cout << fp(5) << "|" << (*fp)(10) << endl; // 兩種呼叫語法等價
}
typedef int (*FP)(int); // 定義型別別名 FP
FP fpi = test; // 使用型別別名宣告變數
cout << fpi(5) << "|" << (*fpi)(10) << endl;
int test(int a) { return a - 1; }
int test2(int (*ra)(int), int b) { // ra 為函式指標參數
return ra(10) + b; // 呼叫傳入的函式
}
int main() {
typedef int (*FP)(int);
FP fpi = test;
cout << test2(fpi, 1) << endl; // 輸出 10
}
此模式廣泛用於回呼函式、演算法自訂比較/處理邏輯(如 qsort、STL 演算法)。
一般指標陣列 void* a[] = {t1,t2,t3}; 僅存放位址,無法直接呼叫 a[0]()。必須宣告為函式指標陣列:
void t1() { cout << "test1"; }
void t2() { cout << "test2"; }
void t3() { cout << "test3"; }
typedef void (*FP)(); // 定義無參無傳回函式指標型別
FP funcs[] = {t1, t2, t3}; // 函式指標陣列
funcs[0](); // 呼叫 t1
funcs[1](); // 呼叫 t2
應用場景: 狀態機、命令派發、選單系統、中斷向量表。
回傳型別 (*指標名)(參數列),括號不可省略。typedef 大幅提升可讀性,尤其用於參數與陣列宣告。void* 陣列。