Пространства имён
Варианты
Действия

Как читать объявление типа

Материал из cppreference.com

Объявление с простым типом несложно понять:

    int i

Но как понять эти более сложные объявления:

    double **d[8];             // Хмм...
    char *(*(**foo[][8])())[]; // Чёрт! Что такое foo?

Чтобы понять эти объявления используйте следующие три правила:

  1. Начинайте с имени переменной (d или foo в примерах выше)
  2. Идите вправо пока можно, затем влево (влево необходимо идти при обнаружении закрывающейся скобки).
  3. Заканчивайте на имени типа (double или char выше)

Первый пример:

Выражение Значение
double **d[8]
double **d[8] d это ...
double **d[8] d это массив из 8 ...
double **d[8] d это массив из 8 указателей на ...
double **d[8] d это массив из 8 указателей на указатель на ...
double **d[8] d это массив из 8 указателей на указатель на double

Второй пример:

Выражение Значение
char *(*(**foo[][8])())[]
char *(*(**foo[][8])())[] foo это ...
char *(*(**foo[][8])())[] foo это массив ...
char *(*(**foo[][8])())[] foo это массив из массивов из 8 ...
char *(*(**foo[][8])())[] foo это массив из массивов из 8 указателей на ...
char *(*(**foo[][8])())[] foo это массив из массивов из 8 указателей на указатель ...
char *(*(**foo[][8])())[] foo это массив из массивов из 8 указателей на указатель на функцию, возвращающую ...
char *(*(**foo[][8])())[] foo это массив из массивов из 8 указателей на указатель на функцию, возвращающую указатель на ...
char *(*(**foo[][8])())[] foo это массив из массивов из 8 указателей на указатель на функцию, возвращающую указатель на массив из ...
char *(*(**foo[][8])())[] foo это массив из массивов из 8 указателей на указатель на функцию, возвращающую указатель на массив из указателей на ...
char *(*(**foo[][8])())[] foo это массив из массивов из 8 указателей на указатель на функцию, возвращающую указатель на массив из указателей на char

Другие примеры можно посмотреть в прекрасном руководстве Steve Friedl о чтении объявлений на C: http://www.unixwiz.net/techtips/reading-cdecl.html.