将指针传递给函数的最佳用例
Best use case of passing pointer to a function
在 C 中将函数指针传递给另一个函数是否有充分的理由。
我没有看到函数指针的一般用例。
如果有人可以提供一些用例,其中函数指针是实现某些特定用例的唯一方法,那就太好了。
一个用例是具有异步回调函数。
您将 callback()
函数的指针传递给 worker()
函数。
worker(void* work, void *callback)
worker 函数完成工作后,它将调用 callback()
函数。
这本质上是面向对象语言 (C++/Java) 中的订阅者发布者模式。
将指向函数的指针作为参数传递给函数的一般用法是在 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)
绘制平方根函数。
但一般来说,除非有必要,否则最好避免使用函数指针。
作为参数的函数指针与其他类型的指针具有相同的通用目的:间接。它们的不同之处在于 行为 是间接的而不是数据,但许多相同的注意事项适用。通过将我的函数设计为接受指向另一个函数的指针,我可以允许调用者决定我的函数行为的各个方面(因为我的函数将 调用 指向的函数作为其工作的一部分).
标准用例可能是标准库的 qsort()
函数,它可以通过接受指向用于比较值的函数的指针来对任何类型的数据进行排序。如果它不能接受函数指针,那么您需要对要排序的每种数据类型使用不同的 qsort()
实现。
在 C 中将函数指针传递给另一个函数是否有充分的理由。 我没有看到函数指针的一般用例。
如果有人可以提供一些用例,其中函数指针是实现某些特定用例的唯一方法,那就太好了。
一个用例是具有异步回调函数。
您将 callback()
函数的指针传递给 worker()
函数。
worker(void* work, void *callback)
worker 函数完成工作后,它将调用 callback()
函数。
这本质上是面向对象语言 (C++/Java) 中的订阅者发布者模式。
将指向函数的指针作为参数传递给函数的一般用法是在 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)
绘制平方根函数。
但一般来说,除非有必要,否则最好避免使用函数指针。
作为参数的函数指针与其他类型的指针具有相同的通用目的:间接。它们的不同之处在于 行为 是间接的而不是数据,但许多相同的注意事项适用。通过将我的函数设计为接受指向另一个函数的指针,我可以允许调用者决定我的函数行为的各个方面(因为我的函数将 调用 指向的函数作为其工作的一部分).
标准用例可能是标准库的 qsort()
函数,它可以通过接受指向用于比较值的函数的指针来对任何类型的数据进行排序。如果它不能接受函数指针,那么您需要对要排序的每种数据类型使用不同的 qsort()
实现。