C语言中函数作为参数的传递

C语言中函数作为参数的传递,c,pointers,arguments,function-pointers,C,Pointers,Arguments,Function Pointers,有时,为什么我们要在C中传递函数的地址作为参数? 我们为什么不直接使用这个函数呢? 我在使用BST的ADT时遇到了这样的代码,这样您就可以传递不同的函数,以改变行为,如多态性,但不需要使用虚拟方法的类或其他技巧 函数指针的好处: 函数指针提供了一种传递有关如何执行操作的指令的方法 您可以编写灵活的函数和库,允许程序员通过将函数指针作为参数传递来选择行为 这种灵活性也可以通过使用带有虚拟函数的类来实现 (from)获取指向另一个函数的指针作为参数的函数可以回调参数函数以执行一些重复操作。因此命

有时,为什么我们要在C中传递函数的地址作为参数? 我们为什么不直接使用这个函数呢?
我在使用BST的ADT时遇到了这样的代码,这样您就可以传递不同的函数,以改变行为,如多态性,但不需要使用虚拟方法的类或其他技巧

函数指针的好处:

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

(from)

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

此问题的答案可能需要解释函数指针的使用/优点

案例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);
在这种情况下,应用程序可以调用API
download\u文件
,并执行自己的操作。每当下载完成时,模块将通过回调通知应用程序,您在调用
download\u file
API期间注册了该回调

案例2:模块的通用实现


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

作为回调,例如:qsort()什么是“BST的ADT”?可能重复的原因有很多。如果您能展示一个编码示例,可以更具体地解释为什么在这种情况下这些想法会起作用