qsort()和转换操作

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)

Jon*_*ler 5

假设你正在排序一个数组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限定sp1sp2指针:

    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().