0
inline int cmp (const void *a, const void *b)
{
  int aa = *(int *)a;
  int bb = *(int *)b;
  return (aa < bb) ? -1 : (aa > bb) ? 1 : 0;
}

这是一个相当简单的函数,如果 a 小于 b,则返回 -1,如果相等则返回 0,如果 a 大于 b,则返回 1。

的属性是const void *什么?据我了解,*(int *)a转换a为指向 an 的指针int并检索其内容,并const void *指向不应修改void *的内存,而指向可以修改的内存,但指向 a 是什么意思void?这不像指向一个int例子。我不认为我说得很清楚。我只是不明白指向 a 的概念void。你能帮我吗?

4

4 回答 4

3

在这种情况下,void *意思是“指向某物,不太确定是什么”。这更像是一种 C 风格的解决方案。在 C++ 中,我会说正确的解决方案是:

template<typename T>
int cmp(const T *a, const T *b)
{
    return (*a < *b)? -1 : (*a > *b) ? 1 : 0;
}

或没有指针:

template<typename T>
int cmp(const T a, const T b)
{
    return (a < b)? -1 : (a > b) ? 1 : 0;
}

但是,C 风格的解决方案在您将它用于“C”风格的功能的情况下可能很有用(qsort想到 - 尽管在这种特殊情况下,我会说std::sort无论如何是一个更好的选择)。

于 2013-09-05T15:08:50.230 回答
1

void *用作指向任何东西的指针,它指向的类型是未知的或无关紧要的。通过将其强制转换为int *您假设它们指向整数,这在您的用例中可能是正确的,例如,当将指向此函数的指针作为ints 集合的比较器传递时。

请注意,转换为int *fromconst void *是不好的风格,应该避免,const int *改为转换为。

于 2013-09-05T15:10:04.507 回答
0

void *a

void *b

是泛型指针,它用于使函数泛型,即它可以对任何数据类型进行操作

这样的原型用于qsort

int (*compar)(const void*,const void*)作为自定义比较器

但是在实际定义的同时比较,您仍然需要提前知道数据类型。

与您的情况一样,它们属于类型int

于 2013-09-05T15:06:07.250 回答
0

void 指针可以转换为任何类型的指针。或者 void 指针只是指向一个内存位置,而不知道它指向什么类型。

于 2013-09-05T15:07:28.443 回答