请在下面的代码中解释 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;
}
感谢您的任何建议。
答案 0 :(得分:2)
const typename * p
是指向常量的指针的语法。这意味着,您无法更改函数中的值。
typename * const p
是常量指针的语法。这意味着您无法在函数中更改指针本身。
在上面的示例中,typename
可以是从标准类型到用户定义类型的任何内容,也可以是void
。如果它是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);
答案 1 :(得分:0)
const void *a
表示a是指向常量的void指针,因此内容无法更改
请参阅此链接以获取解释:
http://en.wikipedia.org/wiki/Const-correctness
但是当你放弃const
内容时,有一个危险的演员。
Peaks *aa = (Peaks *)a;
应改为
const Peaks *aa = (const Peaks *)a;
答案 2 :(得分:0)
比较两个void指针,返回一个大于,等于或小于0的整数,根据a的键是否大于,等于或小于b的键,通过将它们与peak_compare进行比较来确定()。
答案 3 :(得分:0)
使用void*
类型的参数时,没有类型安全,无论它是const
还是Peaks* aa = (Peaks*) a;
。你应该尽可能避免使用C风格的演员表。
aa
可能会导致operator<
无效,从而导致未定义的行为。
如果您因qsort
而需要此功能,我建议您改用std::sort
。
在这种情况下,您可以覆盖Peaks
的{{1}}:
struct Peaks
{
bool operator < (const Peaks& p) const
{
return (wt1 < p.wt1);
}
};
可能会像这样使用:
std::vector<Peaks> vec;
...
std::sort(vec.begin(), vec.end());
答案 4 :(得分:-1)
它们是指向常量数据的指针,正确,请参阅here,这样就无法通过指针更改它们指向的东西的值。