2

请在下面的代码中解释const void *a, const void *b。这些常量引用参数是不是意味着这个函数的内部代码不能改变它的值?为什么要将这些参数作为参考?认为引用参数旨在通过值传递并允许在函数定义内更改值。为什么使用 void 作为参数参数?

int peak_compare(const void *a, const void *b)  //Function peak_compare
{
  Peaks *aa = (Peaks *)a;
  Peaks *bb = (Peaks *)b;

  if(aa->wt1 > bb->wt1) return -1;
  if(aa->wt1 == bb->wt1) return 0;
  return 1;
}

感谢您的任何建议。

4

5 回答 5

2

const typename * pPointer to Constant的语法。这意味着,您不能更改函数中的值。

typename * const p常量指针的语法。这意味着您不能在函数中更改指针本身。

在上面的示例中,typename可以是任何东西,从标准类型到用户定义类型,再到void. 如果它是 a void,则意图是该函数可能会获得指向不同类型的指针。您应该正确地将 void 指针转换为正确的类型,以便访问其成员,就像您的情况一样,以下几行正在执行:

Peaks *aa = (Peaks *)a;
Peaks *bb = (Peaks *)b;

但是这个演员表失去了常数。正确的语法应该是:

const Peaks *aa = (const Peaks *)a;
const Peaks *bb = (const Peaks *)b;

不要失去价值常数。


编辑:正如其中一条评论所指出的,并且由于该问题仅带有 标记C++,因此最好以 C++ 样式进行转换,如下所示:

const Peaks* aa = static_cast<const Peaks*>(a);
const Peaks* bb = static_cast<const Peaks*>(b);
于 2013-03-14T17:39:39.620 回答
0

const void *a表示 a 是指向常量的 void 指针,因此内容不能更改。
有关说明,请参阅此链接: http ://en.wikipedia.org/wiki/Const-correctness

但是,当您松开演员表的const内容时,会有一个危险的演员表。

Peaks *aa = (Peaks *)a;

应改为

const Peaks *aa = (const Peaks *)a;
于 2013-03-14T17:38:10.887 回答
0

比较两个 void 指针,返回一个大于、等于或小于 0 的整数,根据 a 的键是否大于、等于或小于通过 peak_compare() 比较确定的 b 的键。

于 2013-03-14T17:39:25.217 回答
0

无论是否使用类型的参数,都没有类型安全。您应该尽可能避免使用 C 风格的强制转换。void*const

Peaks* aa = (Peaks*) a;

可能导致aa无效,这将导致未定义的行为


如果您因为 需要此功能qsort,那么我建议您std::sort改用。在这种情况下,您可以只覆盖operator<of Peaks

struct Peaks
{
    bool operator < (const Peaks& p) const
    {
        return (wt1 < p.wt1);
    }
};

可以这样使用:

std::vector<Peaks> vec;
...
std::sort(vec.begin(), vec.end());

还可以看看对自定义对象的向量进行排序:)

于 2013-03-14T17:53:41.613 回答
-1

它们是指向常量数据的指针,正确,请参见此处,因此您无法通过指针更改它们指向的事物的值。

于 2013-03-14T17:38:28.763 回答