2

有时,为什么我们在 C 中将函数的地址作为参数传递?我们为什么不直接使用这个函数呢?我在使用 BST 的 ADT 时遇到了这样的代码

4

4 回答 4

1

这样您就可以传递不同的函数,以改变行为,例如多态性,但没有具有虚拟方法或其他技巧的类。

于 2013-07-19T12:41:57.857 回答
0

这个问题的答案可能需要解释一下函数指针的使用/优点。

案例 1:非阻塞 API

假设目标是开发一个通用模块,该模块对文件进行一些网络下载并将输出缓冲区提供给调用者。为了达到这个目标,为应用程序提供一个非阻塞 API 更有意义,如下所示

/* Prototype of the download callback passed as argument */
  typedef int (*app_download_cbk)(char *out_buffer, unsigned int ui_buffer_length);

/* Asynchronous API to download a file */
  int download_file(const char *URI, app_dwnload_callbask app_cbk);

在这种情况下,应用程序可以调用 APIdownload_file并执行自己的操作。每当下载完成时,模块将通过您在 API 调用期间注册的回调通知应用程序download_file

案例2:模块的通用实现

假设目标是开发一个通用模块,该模块对数据库进行一些查询并将数据提供给应用程序。在这种情况下,由应用程序来做它需要的任何事情。因此,您可以设计一个接受函数指针的 API。因此模块可以通过回调传递查询结果,应用程序可以根据需要处理这些结果。

于 2013-07-19T13:08:25.903 回答
0

函数指针的好处:

  • 函数指针提供了一种传递如何做某事的指令的方法
  • 您可以编写灵活的函数和库,允许程序员通过将函数指针作为参数传递来选择行为
  • 这种灵活性也可以通过使用具有虚函数的类来实现

(来自cprogramming.com

于 2013-07-19T12:42:38.163 回答
0

获取指向另一个函数的指针作为参数的函数可以回调参数函数以执行一些重复操作。因此名称回调函数。该函数变得更加通用,因为当您切换回调实现时它可以做不同的事情。例如,它在 Windows GUI 编程中使用,当您注册一个回调函数时,该函数将在有消息供窗口处理时调用,例如单击按钮。

于 2013-07-19T12:47:13.380 回答