指向虚空的指针

时间:2013-09-05 15:03:58

标签: c++

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 *)aa转换为指向int的指针并检索其内容,const void *指向不应在void *点时修改的内存到可以修改的内存, 但指向void是什么意思?例如,它不像指向int。我不认为我很清楚。我只是没有指向void的概念。你能帮忙吗?

4 个答案:

答案 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指针只指向一个内存位置,而不知道它指向的是什么类型。