我正在尝试为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是指向数组中值的指针,在我的例子中,它们是指向指向struct point的指针的指针。因此我将它们转换为双指针(点**),然后将其取消引用一次,并尝试访问struct中的值。编译器给了我一个“请求成员'x'的东西而不是结构或联合”错误
我真的很困惑。有人可以帮我吗?感谢
答案 0 :(得分: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
你看到了这个bug吗? pt1
和pt3
应该有point *
类型(在这种情况下评论是错误的),或者pt1
和pt3
应该被{{1}替换}和&pt1
。注释中的错误应该被视为错误,因此无论如何都是错误。
答案 1 :(得分:1)
如果您在operator precedence上查看参考表,您会发现->
访问运算符的优先级高于类型转换。这意味着表达式(point**)a->x
实际上是对x
成员进行类型转换而不是a
结构指针。你想要,例如(*(point**)a)->x
。