2013-06-28 3 views
0

Я знаю, что:Обозначения: Указатель на массив и массив указателей

Foo *array[10]; // array of 10 Foo pointers  

Foo (*array)[10]; // pointer to array of 10 Foos 

Однако, я не совсем понимаю логику этой записи. То есть, почему первая часть создает массив указателей, почему вторая создает указатель на массив?

Конечно, я могу легко запомнить эту нотацию, но я хотел бы знать логику этого.

+0

Поскольку вы отметили этот вопрос C++, согласились бы вы ответить **, потому что C сделал это так **? :-) –

+0

Попробуйте запомнить эти обозначения: 'int * (* (* (* b)()) [10])();' :) [Чтение C-объявлений.] (Http://www.ericgiguere.com /articles/reading-c-declarations.html) – jrok

+1

AFAIK, обоснование того, как декларации в работе C состоят в том, что они хотели, чтобы они напоминали использование заявленных. Например, для 'Foo (* array) [10];' dererencing it ('* array') дает вам' Foo [10] '. Вот [некоторое чтение] (http://cm.bell-labs.com/cm/cs/who/dmr/chist.html) по этому вопросу. – jrok

ответ

3

Для любого типа T, T * обозначает новый тип ", указатель на T".

Когда T = Foo[10], то T * является указателем на массив из десяти Foo.

Однако обозначение Foo * p[10] анализируется слева направо, жадно, как и (Foo *) p [10], таким образом, является массивом из десяти Foo *. Чтобы получить желаемый указатель на массив, вам нужно сгруппировать имя переменной ближе к звездочке, поэтому T (*p) или Foo (*p) [10].

+2

Я научился читать эти выражения в большей части логического права налево, а не слева направо, начиная с идентификатора. Как в: 'Foo * p [10]' будет получать «p - это массив из десяти указателей на Foo» и «Foo (* p) [10]», поскольку «p - это указатель (скобки прекращают правое разбор) в массив из 10 фонов ». –

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