Структурний тип
Структурний тип. Цей тип (похідний агрегуючий) задає внутрішню будову визначених з його допомогою структур. Сказане потребує пояснень. Почнемо із поняття структури.Структура -це об'єднане в єдине ціле безліч пойменованих елементів (компонентів) даних. На відміну від масиву, який завжди складається з однотипних елементів, компоненти структури можуть бути різних типів і всі повинні мати різні імена. Наприклад, може бути введена структура, що описує товари на складі з компонентами:
• назва товару (char *);
• оптова (закупівельна) ціна (long );
• торгова націнка у відсотках (float );
• обсяг партії товару (int );
• дата надходження партії товару(char [9]).
У переліку елементів структури "товари складі" додані обрані програмістом типи цих елементів. Відповідно до змісту компоненти можуть мати будь-який із типів даних, допустимих у мові. Так як товарів на складі може бути багато, для визначення окремих структур, що містять відомості про конкретні товари, програміст вводить похідний тип, званийструктурним.Для нашого прикладу його можна ввести, наприклад, так:
Тут struct - специфікатор структурного типу (службове слово); goods - запропонована програмістом назва (ім'я) структурного типу. (Використовуючи транслітерацію англійського терміна "tag", назву структурного типу в українськомовній літературі з мови Сі досить часто називають тегом.) У фігурних дужках розміщуються описи елементів, які входитимуть до кожного об'єкту типу goods. Отже, формат визначення структурного типу такий:
structім'я_структурного_типу
деstruct - специфікатор структурного типу;
ім'я_структурного_типу -ідентифікатор, довільно обирається програмістом;
визначення_елементів -сукупність одного або більше описів об'єктів, кожен з яких служить прототипом для елементів структур структурного типу, що вводиться.
Слід звернути увагу, що визначення структурного типу (на відміну визначення функції) закінчується точкою з комою.
Конструкціяstructім'я_структурного_типуграє ту ж роль, що і специфікатори типів, наприклад,double абоint. За допомогоюstruct goods можна визначити конкретну структуру (як, наприклад, об'єкт структурного типуstruct goods), або покажчик на структури такого типу. Приклад:
Крім такого прямого визначення поіменованого структурного типу може бути запроваджено безіменний структурний тип і не повністю визначений (незавершений) структурний тип. Про безіменному структурному типі мова йтиме у цьому параграфі трохи пізніше щодо структур як об'єктів. Не цілком певний, тобто. незавершений структурний тип, знадобиться у наступному параграфі під час розгляду покажчиків на структури, введені як елементи структур. До речі, зазначимо, що незавершеним може бути не лише структурний тип. У загальному сенсі незавершеним вважається будь-яке визначення, в якому немає достатньо інформації про розмір майбутнього об'єкта.
Ще одну можливість ввести структурний тип дає службове словоtypedef, що дозволяє ввести власне позначення для будь-якого визначення типу. У разі структурного типу він може бути введений і названий наступним чином:
typedef struct
Наведене визначення вводить структурний типstruct doublereal;double imag;> і надає йому позначення(назва, ім'я) complex. За допомогою цього позначення можна вводити структури (об'єкти) так само, як із звичайним ім'ям структурного типу (наприклад,struct goods у попередньому прикладі). Приклад:
Структурний тип, якому програміст призначає ім'я за допомогою typedef, може в той же час мати друге ім'я, що вводиться стандартним чином після службового слова struct. ". Будемо вважати, що раціональний дріб - це пара цілих чисел (m; n), де число n від нуля. Визначення такого дробу:
.
Тут fraction - позначення структурного типу, що вводиться за допомогою typedef. Ім'я rational_fraction введено для того ж структурного типу стандартним способом. Після такого визначення структури типу "раціональний дріб" можуть вводитись як за допомогою назви fraction, так і за допомогою позначення того ж типуstruct rational_fraction.
За допомогою директиви#define можна вводити імена типів подібно до того, як це робиться за допомогоюtypedef. Наприклад, відомості про книгу можуть бути введені таким чином:
Тут BOOK - препроцесорний ідентифікатор, за яким у кількох рядках розміщена " рядок заміщення " . Зверніть увагу на використання символу продовження '\' для перенесення строкової константи. Крім того, відзначимо відсутність крапки з комою після закриває дужки ">". Далі у програмі можна визначати конкретні об'єкти-структури чи покажчики за допомогою імені BOOK, введеного на препроцесорному рівні:
(Дивіться нижче визначення структур та визначення покажчиків на структури.)