2011-01-22 3 views
4

Wikipedia утверждает, что оператор [] предшествует оператору *.Приоритет оператора в C Определения

Тогда почему следующее утверждение:

char *a[3]; 

объявить массив 3 символьных указателей, а не указатель на массив из 3 символов как на оператор старшинство?

+4

Объявления = выражения. – delnan

+0

Похожа: http://stackoverflow.com/questions/859634/c-pointer-to-array-array-of-pointers-disambiguation В частности, см. Ответ на вопрос 'cdecl' –

ответ

7

Поскольку, как утверждает Википедия, [] имеет более высокий приоритет, чем *?

Обработка декларации, a[3] обрабатывается как «массив из 3», прежде чем обрабатывать *.

Чтобы объявить указатель на массив из трех символов, вы должны использовать круглые скобки, чтобы переопределить приоритет по умолчанию:

char (*a)[3]; 

Теперь скобки имеют приоритет над массивом.

+1

Но не декларации имеют отдельные правила интерпретации, как заявлено в других ответах? –

+1

@crypto, весь смысл синтаксиса объявления в C заключается в том, что «объявление использует mimicks». – AProgrammer

+0

@crypto: Нет, не совсем. Как говорит @AProgrammer, дизайн системы декларации C таков, что используются имиджы декларации. Итак, 'a [0]' является 'char *', а '* a [0]' является 'char'. –

0

Я запутался в вопросе - интерпретация декларации соответствует приоритету оператора. Если вы хотите, чтобы указатель на массив, вы должны использовать parens, чтобы привязать * к идентификатору 'перед привязкой [].

char (*a)[3]; 
2

Вот грамматика для описателя, как взято из standard (§ 6.7.5):

 
declarator: 
    pointeropt direct-declarator 

direct-declarator: 
    identifier 
    (declarator) 
    direct-declarator[type-qualifier-listopt assignment-expressionopt] 
    direct-declarator[ statictype-qualifier-listopt assignment-expression] 
    direct-declarator[type-qualifier-liststaticassignment-expression] 
    direct-declarator[type-qualifier-listopt* ] 
    direct-declarator(parameter-type-list) 
    direct-declarator(identifier-listopt) 

pointer: 
    *type-qualifier-listopt 
    *type-qualifier-listopt pointer 

type-qualifier-list: 
    type-qualifier 
    type-qualifier-list type-qualifier 

parameter-type-list: 
    parameter-list 
    parameter-list, ... 

parameter-list: 
    parameter-declaration 
    parameter-list,parameter-declaration 

parameter-declaration: 
    declaration-specifiers declarator 
    declaration-specifiers abstract-declaratoropt 

identifier-list: 
    identifier 
    identifier-list,identifier 

Как вы можете видеть, как [] и () связывается с описателем перед тем *. Возьмем декларацию

int *a[N]; 

описатель является *a[N], который приспосабливает указатель отказа прямой описатель рисунок выше, и, таким образом, как разобранную *(a[N]), поэтому a представляет собой N-элемент массива указателей.

Подводя итог:

T *a[N]  -- declares an N-element array of pointer to T 
T (*a)[N] -- declares a pointer to an N-element array of T 
T *f()  -- declares a function returning pointer to T 
T (*f)()  -- declares a pointer to a function returning T 
Смежные вопросы