基本
就像你可以有一個指向 int , char , float ,陣列/字串,結構等的指標 - 你可以有一個指向函式的指標。
宣告指標將獲取函式的返回值,函式的名稱以及它接收的引數/引數的型別。
假設你宣告並初始化了以下函式:
int addInt(int n, int m){
return n+m;
}
你可以宣告並初始化指向此函式的指標:
int (*functionPtrAdd)(int, int) = addInt; // or &addInt - the & is optional
如果你有一個 void 函式,它可能看起來像這樣:
void Print(void){
printf("look ma' - no hands, only pointers!\n");
}
然後宣告指向它的指標將是:
void (*functionPtrPrint)(void) = Print;
訪問函式本身需要解除引用指標:
sum = (*functionPtrAdd)(2, 3); //will assign 5 to sum
(*functionPtrPrint)(); //will print the text in Print function
正如本文件中更高階的示例所示,如果函式傳遞的引數多於幾個,則宣告指向函式的指標可能會變得混亂。如果你有一些指向具有相同結構(相同型別的返回值和相同型別的引數)的函式的指標,則最好使用 typedef 命令為你節省一些輸入,並使程式碼更清晰:
typedef int (*ptrInt)(int, int);
int Add(int i, int j){
return i+j;
}
int Multiply(int i, int j){
return i*j;
}
int main()
{
ptrInt ptr1 = Add;
ptrInt ptr2 = Multiply;
printf("%d\n", (*ptr1)(2,3)); //will print 5
printf("%d\n", (*ptr2)(2,3)); //will print 6
return 0;
}
你還可以建立一個函式指標陣列。如果所有指標都具有相同的結構:
int (*array[2]) (int x, int y); // can hold 2 function pointers
array[0] = Add;
array[1] = Multiply;
也可以定義不同型別的函式指標陣列,但是當你想要訪問特定函式時需要進行轉換。你可以在這裡瞭解更多。