1

我正在尝试为 qsort 编写一个比较函数,并且在取消引用双指针时遇到了麻烦。

我定义了一个结构

typedef struct {
    float x;
    float y;
} point;

我做了一个指向指针的数组:

point* ptarr[2]={pt1,pt3} //pt1 and pt3 have type point*

我的比较函数定义如下:

int compare(const void * a, const void * b){
    return *(point**)a->x-*(point**)b->x;  //This is wrong
}

由于 a 和 b 是指向数组中的值的指针,因此在我的情况下,它们是指向指向结构点的指针的指针。因此,我将它们转换为双指针(point**),然后取消引用它一次,并尝试访问 struct 中的值。编译器给了我一个“在不是结构或联合的东西中请求成员'x'”错误

我真的很困惑。有人可以帮我吗?谢谢

4

2 回答 2

1

这只是一个语法问题,真的。

return *(point**)a->x-*(point**)b->x;        // This is wrong

return (*(point**)a)->x - (*(point**)b)->x;  // This is right

你得到错误的原因*x->y是一样的*(x->y),但是你想要(*x)->y

您的代码中还有一个错误:

point* ptarr[2]={pt1,pt3} // pt1 and pt3 have type point

你看到错误了吗?要么pt1andpt3应该有类型point *(在这种情况下注释是错误的),或者pt1andpt3应该被替换为&pt1and &pt3。评论中的错误应被视为错误,因此无论哪种方式都是错误。

于 2013-02-05T06:55:42.167 回答
1

如果您检查有关运算符优先级的参考表,您将看到->访问运算符的优先级高于类型转换。这意味着表达式(point**)a->x实际上对x成员而不是a结构指针进行类型转换。你想要例如(*(point**)a)->x.

于 2013-02-05T06:56:14.777 回答