是否有充分的理由将函数的指针传递给C中的另一个函数。 我没有看到函数指针的一般用例。
如果有人可以提供一些用例,其中函数指针是实现某些特定用例的唯一方法,那将是很好的。
答案 0 :(得分:5)
一个用例是拥有异步回调函数。
您将callback()
函数的指针传递给worker()
函数。
worker(void* work, void *callback)
一旦工作人员完成了工作,它将调用callback()
函数。
这实际上是面向对象语言(C ++ / Java)中的订阅者发布者模式。
答案 1 :(得分:3)
将函数指针作为参数传递给函数的一般用法是qsort
函数。
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
Another use:
假设您想要一个程序来绘制方程式。您可以为其提供一系列x
和y
值(沿每个轴可能-10
到10
),并要求它在该范围内绘制y = f(x)
(例如-10 <= x <= 10
)
你怎么能告诉它绘制什么功能?当然是通过函数指针!
然后,绘图函数可以在您指定的范围内执行其x
变量,每次需要计算y
时调用指针指向的函数。你可以打电话给
plot(-10, 10, -10, 10, sin)
绘制sine
波形,
plot(-10, 10, -10, 10, sqrt)
绘制平方根函数。
但总的来说,除非有必要,否则最好避免使用函数指针。
答案 2 :(得分:3)
作为参数的函数指针与其他类型的指针具有相同的通用目的:间接。它们的不同之处在于行为是间接的而不是数据,但许多相同的考虑因素都适用。通过设计我的函数来接受指向另一个函数的指针,我可以允许调用者决定函数行为的各个方面(因为我的函数将调用指向函数作为其工作的一部分)。 / p>
规范用例可能是标准库的qsort()
函数,它可以通过接受指向要用于比较值的函数的指针来对任何类型的数据进行排序。如果它无法接受函数指针,那么您需要为要排序的每种数据类型使用不同的qsort()
实现。