abc*_*xyz 2 c struct pointers casting qsort
考虑一个指向结构的指针数组.以下代码取自您可能在此处找到的示例.我想对这两排铸造进行解释.我不熟悉这种"双重铸造".
int myptrstructcmp(const void *p1, const void *p2)
{
struct mystruct *sp1 = *(struct mystruct * const *)p1;
struct mystruct *sp2 = *(struct mystruct * const *)p2;
Run Code Online (Sandbox Code Playgroud)
我认为它应该是:
int myptrstructcmp(const void *p1, const void *p2)
{
struct mystruct *sp1 = (struct mystruct *)p1;
struct mystruct *sp2 = (struct mystruct *)p2;
Run Code Online (Sandbox Code Playgroud)
假设你正在排序一个数组int.你的比较器将被int *伪装成一对伪装void *; 添加了一个间接级别.
如果你正在排序一个数组struct mystruct *,你的比较器被struct mystruct **伪装成void *; 添加了一个间接级别.
是什么意思
struct mystruct * const *?没有const*它就无法正确投射.为什么?
Whaddya的意思是"没有const *它没能正确投射"?没有它const,它的工作正常.没有第二个*,它不起作用,因为函数传递a struct mystruct **(给出或取一些常量),如果你省略第二个星,你就是滥用类型系统.
考虑:
struct mystruct
{
int i;
};
int myptrstructcmp(const void *p1, const void *p2);
int myptrstructcmp(const void *p1, const void *p2)
{
struct mystruct *sp1 = *(struct mystruct **)p1;
struct mystruct *sp2 = *(struct mystruct **)p2;
if (sp1->i < sp2->i)
return -1;
else if (sp1->i > sp2->i)
return +1;
else
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译好了.当你在它const之间添加它时,它也编译得很好**.就个人而言,我不会const在演员中加入.我要做的是const限定sp1和sp2指针:
struct mystruct const *sp1 = *(struct mystruct **)p1;
struct mystruct const *sp2 = *(struct mystruct **)p2;
Run Code Online (Sandbox Code Playgroud)
要么:
const struct mystruct *sp1 = *(struct mystruct **)p1;
const struct mystruct *sp2 = *(struct mystruct **)p2;
Run Code Online (Sandbox Code Playgroud)
这承诺不会修改它们在函数中指向的对象,这对于正确的性能实际上是至关重要的qsort().