2016-03-08 53 views
1

我在一段時間內沒有使用過C,現在我試圖回到它。在指針上使用成員訪問操作符

我的問題是,我的代碼實際上工作,雖然我確信我會得到語法錯誤。他是我想要的: 多邊形的動態陣列,每個都有一個動態的點陣列。

我會對其進行初始化多邊形的數組:

struct polygon* poly_array = (struct polygon*) malloc(sizeof(struct polygon)*num); 

而且,初始化每個多邊形的點陣列:

poly_array[i].quantity = points; 
poly_array[i].point_list = (struct point*) malloc (sizeof(struct point) * poly_array[i].quantity); 

現在,我想我做的,是創建指向該對象的指針數組。因此,要訪問內部字段,我需要使用「 - >」運算符。不過沒有關係,它與「直接」訪問場(短版,沒有循環代碼):

poly_array[i].point_list[j].x = i; 
poly_array[i].point_list[j].y = j; 

,並打印:

printf ("poly %d: (%d, %d)\n", j, poly_array[i].point_list[j].x, poly_array[i].point_list[j].y); 

因此,爲了清楚我的問題,我會再問一次:因爲我正在迭代指向對象的指針,我不應該使用->運算符嗎?

+2

您沒有創建指針數組,也沒有迭代指向對象的指針。也許你的意思是,但這不是你的代碼實際發生的。 –

+0

'type-> field'只是對'(* type).field'的一個平等。它被使用,所以你不必顯式取消引用指向內部類型的指針。 – element11

+0

不,你會使用多邊形 - > point_list [i] ...左手邊必須是一個指針,因此使用箭頭符號來提醒你! –

回答

4

在您的代碼中,poly_array的類型爲struct polygon*,因此,poly_array[i]的類型爲struct polygon。因此,您必須使用.運算符。

同樣的邏輯也適用於point_list[j]也。

要精心,報價C11,章§6.5.2.1,數組下標重點煤礦

語法

postfix-expression [ expression ]

約束

一個表達式的應有類型「‘指針來完成對象類型’」,其他 表達應具有整數類型,和結果類型「‘類型’」

那就是說,please see this discussion on why not to cast the return value of malloc() and family in C.

+0

所以我只是一個擁有實際多邊形的數組,是的? –

+0

@yoadw不是真的,指針不是數組。專注於數據類型本身。 –

+0

所以,如果我想有一個指向多邊形的指針數組,我將如何更改我的代碼? (我希望這不是太多要問,謝謝!) –

0

簡短的答案指的是索引數組已經取消了索引項的引用,所以你使用點語法是正確的。

poly_array[i].point_list[j].x 

您可以使用「 - >」運算符直接取消引用該項目而不使用索引運算符[]。在這種情況下,你會使用指針算術。

(((poly_array+i)->point_list)+j)->x