【问题标题】:Where can we use function pointers in C, what uses for function pointers我们在哪里可以使用 C 中的函数指针,函数指针的用途是什么
【发布时间】:2011-09-02 09:56:17
【问题描述】:

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

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

【问题讨论】:

标签: c


【解决方案1】:

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

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

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

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

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

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


另一个“经典”示例是计算器(例如参见this,它是 C++,但在 C 中是相同的)。

例如,您有四个数学函数

float Plus    (float a, float b) { return a+b; }
float Minus   (float a, float b) { return a-b; }
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 将使用哪些函数。

【讨论】:

    【解决方案2】:

    如果您没有继承/类等,您可以使用 C 进行模拟。例如,根据某些条件调用不同的函数。

    您也可以将函数指针作为参数传递给其他函数。例如,如果你有一个排序算法,你可以通过函数指针提供一个比较函数。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        考虑 qsort()。这是一个通用的排序算法。使用函数指针来比较元素允许用户自定义 qsort() 到他们的特定数据类型。

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

        【讨论】:

          猜你喜欢
          • 2010-12-18
          • 2010-09-20
          • 2014-03-30
          • 2011-04-05
          • 1970-01-01
          • 2021-07-13
          • 2016-11-19
          • 2021-01-24
          • 2016-07-12
          相关资源
          最近更新 更多