2012-02-18 2 views
1
typedef struct stack{ 
int size; 
int array[30]; 
}STACK; 

int p; 
STACK *W; 

В чем разница между (*W).array и (*W).array[0]?
Как получить указатель на первый элемент в массиве, если у меня есть W и p?Указатель на структуры в C

+0

Вы знаете, что вы можете использовать 'W-> array' вместо этого грубого' (* W) .array'? – ThiefMaster

+0

Да, я знаю. Но можно ли использовать W-> array [0]? – user1089723

+0

@ user1089723 Конечно, вы можете. – cnicutar

ответ

6

В чем разница между (* W) .array и (* W) .array [0]

W->array является массивом и W->array[0] является элементом.

Как получить указатель на первый элемент в массиве, если у есть W и p?

Не знаю, что вы хотите сделать с p но W->array уже распадается на указатель на первый элемент. Тем не менее, если вы хотите, скажем, пятый элемент:

int *p = &W->array[4]; 
+0

'int * p = & W-> array [4];' ... как насчет 'int * p = W-> array + 4;'? – LihO

+0

@LihO Конечно, это то же самое :-) – cnicutar

+0

@LihO: Это действительно идентично, хотя некоторые могут считать это менее очевидным (прежние альтернативы говорят буквально: «возьмите адрес вещи в индексе 4»). – delnan

0

Либо (W->array) или &(W->array[0])

Там нет нет разницы в адрес массива и адрес первого элемента массива

+0

Адрес * может * быть одним и тем же, но тип (и размер, и, следовательно, шаги, предпринятые во время арифметики указателя - сравните '& (W-> array) + 1' с' & (W-> array [0]) + 1') отличается. Массивы разлагаются на указатели на их первый элемент, но не во всех контекстах - адрес - это одно исключение. – delnan

+0

@ delnan: Не уверен, что я следую за вами. Вы не согласны с тем, что если у меня есть 'pp = & z [0]', то 'pp' теперь указывает на' z [0] '? Также' pp = z' - это одно и то же. Итак, вы говорите, что есть разница с 'pp = z'? Я говорю, что они одинаковые – Cratylus

+0

И' int * pp = &z[0]; 'и' int * pp = z; 'работают и делают' pp' укажите на первый элемент массива (предполагая, что 'z' является массивом int), но' int * pp = & z' (это то, что использует ваш ответ) не будет. – delnan

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