A Имена типов
В ряде случаев возникает потребность в применении имени типа данных (например при явном приведении к типу, в указании типов параметров внутри объявлений функций, в аргументе оператора sizeof). Эта потребность реализуется с помощью имени типа, определение которого синтаксически почти совпадает с объявлением объекта того же типа. Оно отличается от объявления лишь тем, что не содержит имени объекта.
имя-типа: список-спецификаторов-квалификаторов абстрактный-объявительнеоб
абстрактный-объявитель: указатель
указательнеоб собственно-абстрактный-объявитель
собственно-абстрактный-объявитель: ( абстрактный-объявитель ) собственно-абстрактный-объявительнеоб[константное-выражениенеоб] собственно-абстрактный-объявительнеоб(список-типов-параметровнеоб)
Можно указать одно-единственное место в абстрактном объявителе, где мог бы оказаться идентификатор, если бы данная конструкция была полноценным объявителем. Именованный тип совпадает с типом этого "невидимого идентификатора". Например
int int * int *[3] int (*)[] int *() int (*[])(void)
соответственно обозначают типы int, "указатель на int", "массив из трех указателей на int", "указатель на массив из неизвестного количества int", "функция неизвестного количества параметров, возвращающая указатель на int", "массив неизвестного количества указателей на функции без параметров, каждая из которых возвращает int".