C语言中的双指针延迟

C语言中的双指针延迟,c,pointers,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-

我正试图为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中的值。编译器给了我一个“非结构或联合中的成员'x'请求”错误


我真的很困惑。有人能帮我吗?谢谢,这只是个语法问题,真的

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

您的代码中还有一个bug:

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

你看到虫子了吗?
pt1
pt3
应具有类型
点*
(在这种情况下注释是错误的),或者
pt1
pt3
应替换为
&pt1
&pt3
。注释中的错误应被视为错误,因此无论哪种方式都是错误。

如果您检查上的参考表,您将看到
->
访问操作符的优先级高于类型转换。这意味着表达式
(点**)a->x
实际上键入的是
x
成员,而不是
a
结构指针。你想知道,例如,
(*(point**)a)->x
point*ptar[2]={pt1,pt3}
-这是怎么编译的?
point*ptar[2]={pt1,pt3}//pt1和pt3有类型点
这真的有效吗?对不起,我打错了。pt1和pt3实际上是点*如有疑问,请添加括号。