В алгоритмическом языке С/С++ имеется возможность создавать следующие типы данных пользователя: структуры, объединения, перечисления, массивы, классы (рис. 6.1).
Структура
Структура – это тип данных, представляющий собой определяемый пользователем набор именованных членов (компонентов). Эти компоненты могут быть любых типов, как встроенных (например, int, char, long, float, double и т.д.), так и созданных пользователем, записанные в любой последовательности. Кроме того, компонента структуры может иметь тип битового поля. Тип структуры в языке С/C++ позволяет обрабатывать сложные структуры данных так же легко, как и простые переменные.
Структуры объявляются при помощи ключевого слова struct. Например:
struct mystruct {... }; // mystruct – это тег структуры, т.е. имя типа,
// созданного пользователем.
Тогда объект с типом данной структуры будет создан объявлением
struct mystruct s, *ps, arrs[10]; /* s имеет тип структуры mystruct;
ps это указатель на тип struct mystruct,
arrs – это массив из 10 стpуктуp типа mystruct */
Если тег структуры опущен, то имеется безтеговая структура. Такую структуру можно использовать для объявления идентификаторов в разделяемом запятыми списке идентификаторов структуры как имеющих данный тип структуры, но нельзя объявлять объекты этого типа где-нибудь еще. Например:
|
|
struct {...} s, *ps, arrs[10]; // безтеговая структура
При объявлении структуры с тегом или без него, можно использовать ключевое слово typedef. Например:
typedef struct {... } MYSTRUCT;
MYSTRUCT s, *ps, arrs[10]; // то же, что и struct mystruct s и т.д.
typedef struct {... } YRSTRUCT;
YRSTRUCT y, *yp, arry[20];
Список объявления компонентов в фигурных скобках объявляет типы и имена компонентов структуры. Компоненты структуры могут быть любого типа, за двумя исключениями:
Первое исключение – тип компонента не может быть тот же, что и объявляемая в текущий момент структура, например:
struct mystruct { mystruct s } s1, s2; // так нельзя
Тем не менее, тег структуры может быть указателем на объявляемую структуру. Например:
struct mystruct { mystruct *ps } s1, s2; // так можно
Кроме того, структура может содержать ранее объявленные типы структур (в языке С++ можно опускать ключевое слово struct).
Второе исключение – компонент структуры нигде не может иметь тип "функция, возвращающая...", кроме языка С++, но тип "указатель на функцию, возвращающую..." допустим. В языке С++ ключевое слово struct может иметь компоненты-функции.
Доступ к компонентам структур и объединений выполняется операторами выбора (.) и (->). Операция (.) называется прямым выбором компонента структуры; операция (->) называется косвенным выбором компонента (или указателем) структуры. Например: