我遇到过函数指针可用于实现回调的事实。函数指针还有其他用法吗?是否有其他情况证明函数指针有用?
答案 0 :(得分:3)
排序怎么样?传入一个函数指针来比较任何两个元素。
过滤怎么样?传入函数指针以确定输入元素是否应包含在过滤器的输出中。
变换怎么样?传入一个函数指针,将输入元素转换为输出元素。
这些都是基于集合的用途,但它们非常有用。 (.NET中函数指针的广泛等价物是委托,它们是LINQ的基础,它允许非常简单的查询,转换,分组等。)
您希望能够抽象出“单一行为”的概念,编写一个不需要知道该行为细节的泛型函数,函数指针可能很有用。
答案 1 :(得分:3)
除了Jon写的内容之外,C中的函数指针可用于实现OO编程风格(例如,多态)。
答案 2 :(得分:2)
在实现控件相关模式的反演时,函数指针(或其类型和更高级的等价物)是一个有用的功能。提到的所有示例都是IoC原则的应用(排序算法不控制使用的谓词,对对象方法的调用被延迟到运行时等)
此致
保
答案 3 :(得分:2)
函数指针用于在运行时而不是编译时确定要调用的函数的任何情况。这包括回调,但也可以用作切换案例替代方案,并通过传递定义该行为的函数指针来调整函数的行为 - 这就是标准库qsort()
函数的工作方式例如,使其能够对任何类型的对象进行排序。
我特别使用它们来实现一个命令行解析器,它在运行时计算作为字符串输入的C表达式,并且可以包含函数调用。这使用符号表来查找指向函数的指针,以便可以根据操作员的要求调用它。
您可能希望了解有关此主题的所有信息,请访问The Function Pointer Tutorials
最后,函数指针只是您保存在包中的一种很少使用的工具。如果您了解它们,当出现可能提供解决方案的情况时,您将有希望认识到它。
答案 4 :(得分:2)
这是您在C中实现Higher Order Functions的唯一方法。
答案 5 :(得分:2)
正如其他人所提到的,我发现函数指针(除了回调之外)最重要的用途之一就是能够构建通用数据结构。
假设您要构建具有任意键和值的哈希映射。一种方法是声明void *key
和void *value
,然后在初始化阶段传递两个函数指针:int (*hashcode)(void*)
和int (*equals)(void*, void*)
。
这使您能够构建一个基本上可以编写上述两个函数的任何内容的hashmap。在我的例子中,键是一个固定大小的字符缓冲区,值是一个指向结构的指针。
答案 6 :(得分:2)
它也用于以下
答案 7 :(得分:1)
除了回调(非常适合抽象)之外,函数指针可用于在C中实现多态性。这在Linux内核和glibc,GTK +和GLib等常用C库中广泛完成。