Этот вопрос следует за другим вопросом о декларациях C . Читая ответ на этот вопрос, Я читал о правиле спирали , и я также понял, что означает «объявление следует за использованием».
Хорошо, пока. Но затем я прочитал это объявление :
char *(*(*a[N])())();
и мне было интересно, как его разобрать с помощью «правила» «объявление следует за использованием». Специально для части массива.
Я прочитал следующее:
(*(*a[N])())
- это функция ()
, возвращающая char *
, то разыменование следующего
(*a[N])() // 1
будет следующим: функция, возвращающая char *
', поэтому 1 -' указатель на функцию, возвращающую char *
'
тогда я бы сказал: «когда вызывается (* a [N])
, это [предыдущее объявление]». На данный момент у нас есть (* a [N])
- это функция, возвращающая указатель на функцию, возвращающую char *
.
Но тогда я не знаю, как применить это правило, чтобы различать «указатель на массив» и «массив указателя».
Может кто-нибудь прояснить это?
Другой вопрос: каковы правила «приоритета» в таких объявлениях между и
(в C ++), *
и []
]? [возможно, «приоритет» - неправильный термин]
Чтобы проверить, правильно ли я понял «правило спирали», я также разбираю это выражение ниже; скажите, пожалуйста, если я ошибаюсь.
+-----------+
| +------+ |
| | +-+ | |
| | ^ | | |
char* (*(* a[N])())();
^ ^ ^ ^ ^ ^
| | | | | |
| | +---+ | |
| +--------+ |
+--------------+
Для меня это проще (цикл за циклом):
a
- это массив из N ... char *
Но я, возможно, что-то упустил, что в этом случае позволило мне получить правильный ответ, но это могло быть неправильно в еще один более сложный случай.