C语言中的双指针延迟
我正试图为qsort编写一个比较函数,但在反引用双指针时遇到了问题 我定义了一个结构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-
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实际上是点*如有疑问,请添加括号。