我们在哪里可以使用C中的函数指针,什么用于函数指针

就在最近我接受采访时被问到:我们在哪里可以使用C中的函数指针? 什么函数指针返回。 我说使用我们可以使用函数指针调用函数然后他问了一些例子,但我不能满足于他更多的例子。 然后他问我什么函数指针返回。 我告诉他这取决于函数指针的声明。

但我真的想知道C中函数指针的一些用法。

我认为C中的经典例子是qsort 。 从那里引用(我知道它是http://www.cplusplus.com ,所以一个不太好的网站,但它似乎是正确的)

void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) ); 

比较两个元素的函数。 该function应遵循以下原型:

 int comparator ( const void * elem1, const void * elem2 ); 

该函数必须接受两个指向元素的参数,类型为void *。 应将这些参数转换回某些数据类型并进行比较。

该函数的返回值应表示elem1是否被认为小于,等于或大于elem2,分别返回负值,零或正值。


另一个“经典”的例子是计算器(例如看到它 ,它是C ++,但它在C中是相同的)。

例如,您有四个数学函数

 float Plus (float a, float b) { return a+b; } float Minus (float a, float b) { return ab; } float Multiply(float a, float b) { return a*b; } float Divide (float a, float b) { return a/b; } 

以某种方式你选择你的操作

 /* Here there should be an if or a switch/case that selects the right operation */ float (*ptrFunc)(float, float) = Plus; 

你可以稍后调用它(出于某种原因你不想直接在if/switch调用它,也许是因为你想要制作对所有操作都“常见”的其他“东西”,比如记录或打印结果)

 float result = ptrFunc(1.0f, 2.0f); 

你可以使用函数指针的另外两件事是回调(由vine'th编写)和“穷人”虚函数(你把它们放在一个struct ,当你创建struct (你知道,就像使用“穷人”)构造函数,但这是C所以我们将它称为初始化程序),你保存那个struct将使用的struct )。

如果你没有inheritance/类等,你可以用C模拟它。例如,根据某些条件调用不同的函数。

您还可以将函数指针作为参数添加到其他函数中。 例如,如果您有排序算法,则可以通过函数指针提供比较函数。

是的,你对返回值是正确的。 这取决于定义。

函数指针用于异步通知,例如,一般范例是传递函数指针和将由库调用的回调数据。 你可以在glib mainloop中看到一个例子; 在C ++ STL中,您可以查看广泛使用的仿函数 ,函数指针是一个仿函数。

当我想到使用函数指针时,我认为在从本质上通用的代码到本质上是专用的或自定义的代码的调出中使用它们。

考虑qsort()。 这是一种通用的排序算法。 使用函数指针比较元素允许用户将qsort()自定义为其特定的数据类型。

考虑文件系统。 大多数系统使用虚拟文件系统框架来处理它们。 该框架提供了通用function。 为了处理这些差异,该框架通过函数指针对文件系统特定代码进行调用。