基本

就像你可以有一个指向 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;

你可以在这里这里了解更多。

也可以定义不同类型的函数指针数组,但是当你想要访问特定函数时需要进行转换。你可以在这里了解更多。