
Структури та об'єднання
Структура - це іменована сукупність змінних можливо різних типів, розташована в пам'яті послідовно один за одним. Структури називаються користувача типами даних і допомагають в організації складних даних, оскільки дозволяють групу пов'язаних між собою змінних трактувати не як безліч окремих елементів, а як єдине ціле. Традиційний приклад структури - рядок платіжної відомості. Вона містить такі відомості про службовця, як його повне ім'я, адресу, номер картки соціального страхування, зарплата і т.д. Деякі з цих характеристик самі можуть бути структурами: наприклад, повне ім'я складається з декількох компонент (прізвища, імені та по батькові); аналогічно адресу, і навіть зарплата. Інший приклад (більш типовий для Сі) - з області графіки: точка є пара координат, прямокутник є пара крапок і т. д.
Головні зміни, внесені стандартом ANSI щодо структур, - це введення для них операції привласнення. Структури можуть копіюватися, над ними можуть виконуватися операції привласнення, їх можна передавати функцій як аргументи, а функції можуть повертати їх в якості результату. У більшості компіляторів вже давно реалізовані ці можливості, але тепер вони точно обумовлені стандартом. Для допускається ініціалізація.
Основні відомості про структури
Оголошення структури починається з ключового слова struct і містить список оголошень, укладений у фігурні дужки:
struct імя_структури { список оголошень; }; імя_структури іноді називають тегом структури.
Перераховані в структурі змінні називаються елементами. Елементами структур можуть бути: - Змінні та масиви базових типів, - Змінні та масиви для користувача типів, крім типу самої структури імя_структури, - Покажчики на будь-які типи, включаючи і тип самої структури імя_структури, - Функції.
Включення до структури елементів-функцій не є загальноприйнятим. Як правило, в цьому випадку переходять до поняття класу.
Елементи структур є публічними, тобто до елементів структурних змінних можна звертатися в будь-якому місці області видимості цих змінних.
Наведемо приклад структури time:
struct time { int hour; int minutes; };
У нашому прикладі елементами структури будуть hour і minutes.
Оголошення структури не резервує пам'яті. Воно є інформацією компілятору про введення користувальницького типу даних. Пам'ять виділиться при визначенні структурних змінних. Якщо структурний тип в програмі більше не буде використовуватися, оголошують безіменну структуру одночасно з визначенням змінної.
Наприклад,
struct { int x, y; } Q;
Однак якщо структура має тег, то цим тегом далі можна користуватися при визначенні структурних об'єктів. Наприклад, за допомогою заданого вище опису структури time рядок struct time t; визначає структурну змінну t типу struct time. Прийнято використовувати один і той же термін структура стосовно до призначеного для користувача типу даних і до структурної змінної. Однак, по фразах «оголошення структури» і «визначення структури» ситуація стає однозначною. Для структурної змінної, як і для масиву при оголошенні відразу виділяється пам'ять. Тому структурна змінна визначається, а тип оголошується.
Структурну змінну при її визначенні можна ініціалізувати, формуючи список ініціалізаторов її елементів у вигляді константних виразів. При цьому кожен елемент, що сам є структурою або масивом, ініціалізується окремою парою фігурних дужок. Доступ до окремого елементу структури здійснюється за допомогою бінарної операції «крапка». Офіційна назва цієї операції: звернення до елемента структури на ім'я структури.
Синтаксис операції
Имя_структуры.элемент_структуры
Операція доступу до елементу структури '.' з'єднує ім'я структури і ім'я елемента. Наприклад,
struct time t = {21, 30}; printf ("% d:% d", t.hour, t.minutes);
Структури можуть бути вкладені одна в одну. Наприклад, структура chronos містить дві структури time begin і end:
struct chronos { struct time begin, end; }; struct chronos timer = {{2,4}, {10, 10}};
Вираз timer.begin.minutes звертається до хвилин minutes часу begin з timer. У стандарті ANSI C ключове слово struct при оголошенні структурних змінних можна опускати, тобто допустима і загальноприйнята запис.
chronos timer;
Розмір структури в байтах складається з розміру її елементів. Наприклад, sizeof (timer) = 8 байт. Однак, якщо включена опція компілятора Options-Compiler-Code generation-Word allgnment, то всі елементи будуть розташовуватися по парних адресами. Тому в разі struct FIO {char F [25], I [15], Otch [20]}; будемо мати sizeof (FIO) = 26 + 16 + 20 = 62.