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
转换为指向int
的指针并检索其内容,const void *
指向不应在void *
点时修改的内存到可以修改的内存,
但指向void
是什么意思?例如,它不像指向int
。我不认为我很清楚。我只是没有指向void
的概念。你能帮忙吗?
答案 0 :(得分: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
会浮现在脑海中 - 尽管在这种特殊情况下,我会说{{1}无论如何,这是一个更好的选择)。
答案 1 :(得分:1)
void *
用作指向任何内容的指针,指向它的类型未知或无关紧要。通过将其转换为int *
,您假设它们指向整数,这在您的用例中可能是正确的,例如,当将指向此函数的指针作为int
集合的比较器传递时第
请注意,从int *
投射到const void *
是不好的风格,应避免使用,转而转换为const int *
。
答案 2 :(得分:0)
void *a
void *b
是通用指针,用于使函数通用,即它可以在任何数据类型上运行
此类原型用于qsort
int (*compar)(const void*,const void*)
作为自定义比较器
然而,在比较实际定义时,您仍需要提前知道数据类型。
在您的情况下,它们属于int
答案 3 :(得分:0)
Void指针可以被类型化为任何类型的指针。或者void指针只指向一个内存位置,而不知道它指向的是什么类型。