"Мюррэй Хилл, Бьярн Страустрап. Язык С++" - читать интересную книгу автора


int* a;
float v[10];
char* p[20]; // вектор из 20 указателей на символ
void f(int);
struct str { short length; char* p; };

Правила построения типов с помощью этих операций подробно
объясняются в #с.8.3-4. Основная идея состоит в том, что описание
производного типа отражает его использование. Например:

- стр 55 -

int v[10]; // описывает вектор
i = v[3]; // использует элемент вектора

int* p; // описывает указатель
i = *p; // использует указываемый объект

Вся сложность понимания записи производных типов проистекает из
того, что операции * и & префиксные, а операции [] () постфиксные,
поэтому для формулировки типов в тех случаях, когда приоритеты
операций создают затруднения, надо использовать скобки. Например,
поскольку приоритет у [] выше, чем у *, то

int* v[10]; // вектор указателей
int (*p)[10]; // указатель на вектор

Большинство людей просто помнят, как выглядят наиболее обычные
типы.
Описание каждого имени, вводимого в программе, может оказаться
утомительным, особенно если их типы одинаковы. Но можно описывать в
одном описании несколько имен. В этом случае описание содержит
вместо одного имени список имен, разделенных запятыми. Например,
два имени можно описать так:

int x, y; // int x; int y;

При описании производных типов можно указать, что операции
применяются только к отдельным именам (а не ко всем остальным
именам в этом описании). Например:

int* p, y; // int* p; int y; НЕ int* y;
int x, *p; // int x; int* p;
int v[10], *p; // int v[10]; int* p;

Мнение автора таково, что подобные конструкции делают программу
менее удобочитаемой, и их следует избегать.

2.3.4 Тип void