基本

就像你可以有一個指向 intcharfloat陣列/字串結構等的指標 - 你可以有一個指向函式的指標。

宣告指標將獲取函式返回值,函式名稱以及它接收的引數/引數型別

假設你宣告並初始化了以下函式:

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;

你可以在這裡這裡瞭解更多。

也可以定義不同型別的函式指標陣列,但是當你想要訪問特定函式時需要進行轉換。你可以在這裡瞭解更多。