Структурний тип

Структурний тип. Цей тип (похідний агрегуючий) задає внутрішню будову визначених з його допомогою структур. Сказане потребує пояснень. Почнемо із поняття структури.Структура -це об'єднане в єдине ціле безліч пойменованих елементів (компонентів) даних. На відміну від масиву, який завжди складається з однотипних елементів, компоненти структури можуть бути різних типів і всі повинні мати різні імена. Наприклад, може бути введена структура, що описує товари на складі з компонентами:

• назва товару (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, введеного на препроцесорному рівні:

(Дивіться нижче визначення структур та визначення покажчиків на структури.)