基本
就像你可以有一个指向 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;
也可以定义不同类型的函数指针数组,但是当你想要访问特定函数时需要进行转换。你可以在这里了解更多。