2013-02-05 73 views
1

我正在嘗試爲qsort編寫一個比較函數,並且在解除引用雙指針時遇到了問題。在C中設置雙指針

予定義的結構

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 
} 

由於和b是指向數組中值的指針,在我的情況下,它們是指向指向結構指針的指針的指針噸。因此,我將它們轉換爲雙指針(點**),然後解除引用一次,並嘗試訪問struct內的值。編譯器給了我一個「請求會員'x'的東西不是結構或聯盟」錯誤

我對此非常困惑。有人可以幫我嗎?謝謝

+0

'point * ptarr [2] = {pt1,pt3}' - 這是如何編譯的? – 2013-02-05 06:57:11

+0

'point * ptarr [2] = {pt1,pt3} // pt1和pt3有類型點'這實際上有效嗎? – cnicutar

+0

對不起,我犯了一個錯字。 pt1和pt3實際上是指向* – turtlesoup

回答

1

如果您檢查operator precedence的參考表,您會看到->接入運算符的優先級高於類型轉換。這意味着(point**)a->x這個表達式實際上包含了x成員而不是a結構指針。您需要例如(*(point**)a)->x

+0

你的意思是(*(point **)a) - > x',不是'((point **)a) - > x'。 –

+0

@DietrichEpp是的,當然 –

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 

你看到的錯誤? pt1pt3應該有point *(在這種情況下評論是錯誤的),或者pt1pt3應該被&pt1&pt3替換。評論中的錯誤應該被視爲錯誤,所以它是一種錯誤。