【问题标题】:what is the purpose of using this parameter, int (*cmp) (void*, void*)使用这个参数的目的是什么,int (*cmp) (void*, void*)
【发布时间】:2020-09-16 08:38:41
【问题描述】:

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

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

有人能解释一下吗?

感谢您的帮助。

【问题讨论】:

  • 这是调用者提供的比较函数,用于将新值与堆栈中已有的值进行比较。
  • 这允许堆栈保存任何类型的数据,因为调用者提供了比较函数。
  • 不应该是set,而不是stack吗?或者它是一个可以删除重复元素的堆栈?
  • LINKEDSTACK set_maker 是正确的,我如何在函数中使用这个参数,我应该写一个函数进行比较?
  • @MertSezigen 检查此以获取使用示例:tutorialspoint.com/c_standard_library/c_function_qsort.htm

标签: c parameters int void void-pointers


【解决方案1】:

它是一个指向函数的指针,它接受两个指针参数并返回一个int。从它的名字来看,该函数的语义是比较指向的两个对象,并返回一个值0,表示这两个对象根据一些排序标准的相对order .

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

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

那么你可以这样调用set_maker()

set_maker( istack, icompare ) ;

这样set_maker() 可以在LINKEDSTACKints 上运行。 (由于您没有提供set_maker()LINKEDSTACK 的详细信息,因此我在这里进行了一些合理的猜测。

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

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

【讨论】:

  • 我认为这个函数更适合进行相等性测试,因为它被传递给函数来创建一个集合(删除重复项)
  • @EugeneSh。最有可能,但比较指示 order 是正常语义。调用函数可能确实只测试零/非零。我试图让它保持通用,因为我们只能猜测函数的作用。
【解决方案2】:

在 C 中,处理有序序列的 bsearch 和 qsort 等函数需要一个比较数组元素的函数。

指向此类函数的指针声明为

int ( *cmp )( const void *, const void * )

它接受将要比较的两个对象的指针作为参数。在函数内,转换为所需类型后的指针被取消引用,并比较指向的对象。

如果分别认为第一个指向的对象小于、匹配或大于第二个指向的对象,则该函数应返回一个小于、等于或大于零的整数。

似乎set_maker 函数在其主体中使用了这样一个比较函数来比较两个对象,例如对它们进行排序。

.

【讨论】:

    【解决方案3】:

    int (*cmp) (void*, void*)

    它是指向函数的指针,它接受两个void *类型的参数并返回int

    应该是比较两个指针或指针引用的对象的函数-谁知道

    【讨论】:

    • 比较指针所指的两个对象,而不是比较指针本身。我确定这就是您的意思,但可能不清楚。
    • 是的,但不太可能。如果您要做的只是比较指针,那么您将直接传递指针而不是函数指针。没有很多方法可以将一个指针与另一个(一个)指针进行比较。
    • @Clifford 因为我不知道我已经修改了答案以涵盖这两个选项。有趣的是谁以及为什么 DV-ted 我的答案
    • 我明白了,就我而言,一切都很好。对我来说,投反对票需要付出很大的努力——通常是冒犯性或垃圾邮件,无论质量或有效性如何,都不是有效的帮助尝试,在这种情况下当然不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    相关资源
    最近更新 更多