2014-02-04 6 views
2

Как можно получить доступ к структурам структур, используя арифметику указателя?Массив структур и арифметика указателя

Предположим, у меня есть на структуру

struct point{ 
int x; 
int y; 
}collection[100]; 

Предположим, у меня есть функция

int func(struct point *collection,int size) 

Внутри этой функции я получить доступ к элементу, как показано ниже.

collection[0].x 

Это то же самое, что *(collection + 0).x? Поскольку оператор . имеет более высокий приоритет, чем оператор *, сначала указатель коллекции увеличивается на 0, а оператор точки применяется, а затем разыгрывается указатель? Так или иначе, это не имеет смысла; любое уточнение оценивается.

+1

Если вы действительно хотите испечь свою лапшу, можете ли вы решить, что '0 [коллекция] .x' есть? –

+0

@ Eric Lippert (* (0 + collection)). X, из того, что я собрал, оператор [] означает ... a [5] = * (a + 5), поэтому 5 [a] означает * (5 + a) поэтому 0 [коллекция] .x - это то же самое, что и коллекция [0] .x взял меня на некоторое время, я понял все правильно. – tesseract

+0

Вы поняли! Индексирование - просто причудливый вид сложения, и добавление является коммутативным. –

ответ

2

Это то же самое, что и *(collection + 0).x?

No. Ваше объяснение абсолютно верно, . имеет более высокий приоритет, чем *, так что второе выражение обрабатывается как *((collection + 0).x). collection[i].x, с другой стороны, эквивалентен (*(collection + i)).x.

На самом деле эта неловкость причина был введен оператор ->, поэтому при условии y некоторые нетривиальная выражение, вы можете написать

y->x 

вместо

(*(y)).x 

Хотя очевидно collection[0].x гораздо более чистый, чем (collection + 0)->x в данном конкретном случае.

+0

(* (collection + i)). X, это имеет гораздо больше смысла, поэтому массивы структур имеют дополнительный набор круглых скобок перед оператором точки при использовании арифметики указателя. – tesseract

+1

@tesseract: Я предполагаю, что суть в том, что если у вас есть указатель на структуру (например, 'collection + i', который является указателем), и вы хотите получить доступ к полю структуры, на который указывает ваш указатель, вам нужно * разыменовать указатель, а затем применить к нему оператор точки. Поскольку оператор точек имеет довольно высокий приоритет, вам необходимо принудительно разыменовать, используя явную пару скобок. –

Смежные вопросы