Бьерн Страуструп - Язык программирования С++. Главы 2-4 - Производные типы
ОГЛАВЛЕНИЕ
Страница 11 из 69
2.3.3 Производные типы
Исходя из основных (и определенных пользователем) типов, можно с помощью следующих операций описания:* указатель
& ссылка
[] массив
() функция
а также с помощью определения структур, задать другие, производные типы. Например:
int* a;Правила построения типов с помощью этих операций подробно объяснены в $$R.8. Ключевая идея состоит в том, что описание объекта производного типа должно отражать его использование, например:
float v[10];
char* p[20]; // массив из 20 символьных указателей
void f(int);
struct str { short length; char* p; };
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;