c - 使用这个参数的目的是什么,int (*cmp) (void*, void*)

标签 c parameters int void void-pointers

在我的作业中我无法理解这个参数;

set_maker(LINKEDSTACK stack, int (*cmp) (void*, void*))

有人可以用这个来解释一下吗?

感谢您的帮助。

最佳答案

它是一个指向带有两个指针参数并返回一个int的函数的指针。从它的名字来看,该函数的语义是,它比较所指向的两个对象,并返回一个值<0、0或>0,指示两个对象根据某种排序标准的相对顺序 .

此类参数的目的是允许函数(在本例中为set_maker())对任意类型和排序规则的对象进行操作。例如,如果您在 int 对象中进行操作,您可能有一个函数:

int icompare(const void * a, const void * b) 
{
   return ( *(int*)a - *(int*)b );
} 

然后你可以这样调用set_maker():

set_maker( istack, icompare ) ;

这样 set_maker() 就可以对 intLINKEDSTACK 进行操作。 (我在这里做出了一些合理的猜测,因为您没有提供 set_maker()LINKEDSTACK 的详细信息)。

同样,比较函数可以对具有涉及多个成员的更复杂比较规则的 struct 对象进行操作。因此,其目的是通过在所提供的函数中提供处理每种数据类型的规则,使 set_maker() 足够灵活,能够处理任何数据类型,而无需重复大量代码。

此类函数的标准库示例是 qsort() ,尽管您会注意到参数的类型为 const void*,这对于不打算修改引用对象的函数来说是最佳实践。

关于c - 使用这个参数的目的是什么,int (*cmp) (void*, void*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62074728/

相关文章:

c - 读取字符串并将其分配给数组

只有 pthreads 的 C++ 定时器

c++ - 自动添加符合 CV 条件的函数

sql - 为什么 sqlParameter 请求一个 sourceColumn?

php - 如何将 Phalcon 的 .volt 中的变量转换为 int?

dart - 如何在 dart/flutter 中声明 64 位无符号整数?

c - time.h:打印时间时屏幕上还有一个 '%'

c - 使用 stat(2) - 获取 inode 编号和硬链接(hard link)计数

c - 总线错误: 10 While compiling C program

parameters - 普通口齿不清 : Working with &rest parameters