当前位置: 首页 > 知识库问答 >
问题:

我了解这个 C 函数(qsort 比较函数)吗?

柴默
2023-03-14

我的目标是使用来自stdlib.h的qsort。qsort 需要一个比较函数参数来实现这一点:

int (*compar)(const void *, const void*)

我是否正确地将其理解为“指向 int 返回函数 f 的指针必须接受两个参数,它们是通用指针”?我不确定“*比较”周围括号的含义 - 我可以查找这个名字吗?

该链接提供了一个示例

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

我会正确地将 *(int*)a 读成“在 a 被转换为指向整数的指针后取消引用它的值”吗?

干杯。

共有3个答案

倪阳飇
2023-03-14

是的。您正确理解了这两种语法。*compar 周围的括号 () 表示 compar 是函数指针。如果没有它,含义将完全不同。

曹育
2023-03-14

你走在正确的道路上。

在第一个示例中,compar 称为函数指针。() 是函数指针语法的一部分。

请注意,如果没有 *compare 周围的显式 (),compar 将被视为返回 int * 的功能,接受两个指针。

对于第二种情况,对于二进制减法运算符 -,来自 C99 标准,第 6.5.6 章,第 3 段,

— 两个操作数都有算术类型;

— 这两个操作数都是指向兼容对象类型的限定或非限定版本的指针;或

— 左操作数是指向对象类型的指针,右操作数是整数类型。(递减等于减去 1。

关于第一点,算术类型,来自第 6.2.5 章第 18 段,

整数和浮点类型统称为算术类型。

因此,在这里,在使用指针进行减法之前,将它们转换为 int 指针,然后取消引用,并且值用作整数减法的操作数。

杭志泽
2023-03-14

我是否正确地将其理解为“指向 int 返回函数 f 的指针必须接受两个参数,它们是通用指针”?

完全正确。

我不确定 *compar 周围括号的含义

这是声明指向函数(称为“函数指针”)的指针的语法。如果没有参数,它将是一个函数声明

// Declares a function named compar. (It returns an int*.)
int *compar(const void *, const void*);

// Declares a function pointer named compar. (The func returns an int.)
int (*compar)(const void *, const void*);

我会正确地将 *(int*)a 读成“在 a 被转换为指向整数的指针后取消引用它的值”吗?

再次更正。它给出了地址 a 处的 int

 类似资料:
  • 在下面的代码中,一旦我删除了比较字符串的注释部分,我就会出现seg 11错误。我无法理解为什么!其余代码运行良好。感谢任何帮助!

  • 我想比较这两个函数的值。不幸的是,我试图使,但我一直得到。 我想检查如果。这就是我上面完整的代码。

  • 比较函数是一个函数,它接受两个参数a和b,并返回一个描述其顺序的整数。如果a小于b,则结果为负整数。如果a大于b,则结果为某个正整数。否则,a和b相等,结果为零。 此函数通常用于参数化来自标准库的排序和搜索算法。 实现字符的比较功能相当容易;只需减去参数: 这是因为通常假设两个字符之间的差适合一个整数。(注意,此假设不适用于的系统) 这种技巧无法用于比较整数,因为两个整数之间的差通常不适合一个整数

  • 有没有一个相当标准的C(Linux)函数,或者一种代码高效但性能良好的方法来比较任意大小的两个整数? 我正在寻找一些参数为int intcmp(const void*a,const void*b,size\t size)的东西,它适用于任何实际大小的整数。(如果架构是big-endian的话(我认为)可以工作。) 我倾向于使用这样的实现(通过高效整数比较函数的改进),但它不是完全通用的,并且有足够

  • 过滤出数组中比较函数不返回 true 的所有值。 类似于difference ,除了接受一个 comparator (比较函数)。 使用 Array.filter() 和 Array.findIndex() 来查找合适的值。 const differenceWith = (arr, val, comp) => arr.filter(a => val.findIndex(b => comp(a, b

  • 问题内容: 这怎么不出现属性错误?函数对象没有任何比较方法。它以某种方式使用id()吗? 我知道它比较地址,但是如何?拦截__lt , eq__等是一些低级黑客吗? 问题答案: 函数对象没有定义自己的比较或丰富的比较。相反,它们从类型对象继承,这些类型对象根据内存中的对象地址实现丰富的比较。 因此,是的,它像内置的id()函数一样有效地使用地址。 在Python 3中,功能不再可排序。

  • 问题内容: 在python中,是没有重复元素的无序集合。但是,我无法理解它如何生成输出。 例如,考虑以下内容: 应该不是的输出是:?我在Python 2.6中尝试了以上两个。 问题答案: 正如您所说,集合是无序的。即使实现集合的一种方法是使用树,也可以使用哈希表来实现(这意味着按排序顺序获取键可能并不那么琐碎)。 如果您想对它们进行排序,则可以执行以下操作: 这将产生一个包含集合元素的排序列表。(

  • 尝试编写一些干净的JS排序函数。下面是我的模板中一个按钮的click处理程序,它调用各个方法按不同的属性排序。 它调用下面的方法。它的工作很好,这是很好的! 我遇到的问题是,我已经有了大约4个这样的排序方法,我想把if语句放入它们自己的函数中,以便更好地编写干巴巴的代码。所以我尝试了下面的方法,但是compareFunction甚至从来没有调用过GET。我做错了什么?