在C中取消引用双指针

时间:2013-02-05 06:53:22

标签: c pointers

我正在尝试为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'的东西而不是结构或联合”错误

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

2 个答案:

答案 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吗? pt1pt3应该有point *类型(在这种情况下评论是错误的),或者pt1pt3应该被{{1}替换}和&pt1。注释中的错误应该被视为错误,因此无论如何都是错误。

答案 1 :(得分:1)

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