Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка (Мова С) .doc
Скачиваний:
13
Добавлен:
04.11.2018
Размер:
1.22 Mб
Скачать

Структури

Cтруктура – це складений об'єкт, у який входять елементи будь-яких типів, за винятком функцій. На відміну від масиву, що є однорідним об'єктом, структура може бути неоднорідною.

Тип структури визначається записом виду:

struct { список визначень }

У структурі обов'язково повинен бути зазначений хоча б один компонент. Визначення структур має такий вигляд:

<тип-даних> <опис>;

де <тип-даних> вказує тип структури для об'єктів, визначених в назві. У найпростішій формі <опис> – ідентифікатор або масив.

Приклад:

struct { double x,y; } s1, s2, sm[9];

struct { int year;

char month, day;} date1, date2;

Змінні s1, s2 визначаються як структури, кожна з яких складається із двох компонентів х та y. Змінна sm визначається як масив з дев'яти структур. Кожна із двох змінних date1, date2 складається із трьох компонентів year, month, day. Існує і інший спосіб асоціювання імені з типом структури, він базується на використанні тегу структури. Тег структури аналогічний тегу перераховуваного типу. Тег структури визначається в такий спосіб:

struct <тег> { список описів; };

де <тег> є ідентифікатором.

У наведеному нижче прикладі ідентифікатор student описується як тег структури:

struct student { char name[25];

int id, age;

char prp; };

Тег структури використається для наступного оголошення структур даного виду у формі:

struct <тег> <список-ідентифікаторів>;

Приклад:

struct student st1,st2;

Використання тегів структури необхідне для опису рекурсивних структур. Нижче розглядається використання рекурсивних тегів структури.

struct node { int data;

struct node * next;} st1_node;

Тег структури node дійсно є рекурсивним, тому що він використовується у своєму власному описі, тобто у формалізації покажчика next. Структури не можуть бути прямо рекурсивними, тобто структура node не може містити компонент, що є структурою node, але будь-яка структура може мати компонент, що є покажчиком на свій тип, що і зроблено в наведеному прикладі.

Доступ до компонентів структури здійснюється за допомогою вказівки імені структури і через крапку імені потрібного компонента, наприклад:

st1.name="Іванов";

st2.id=st1.id;

st1_node.data=st1.age;

Тут за допомогою крапки (.) здійснено прямий вибір компонентів структур. Якщо доступ до елемента структури відбувається через вказівник, то після імені структури вказується стрілка (–>) і відбувається непрямий вибір компонентів структури, наприклад:

struct student *p1, *p2;

. . .

p1->name="Іванов";

p2->id=p1->id;

Об'єднання

Об'єднання подібне до структури, однак у кожен момент часу може використовуватися тільки один з елементів об'єднання. Тип об'єднання може задаватися в наступному виді:

union { опис елемента 1;

...

опис елемента n; };

Головною особливістю об'єднання є те, що для кожного з оголошених елементів виділяється та сама область пам'яті, тобто вони перекриваються. Хоча доступ до цієї області пам'яті можливий з використанням кожного з елементів, елемент для цієї мети повинен вибиратися так, щоб отриманий результат не був безглуздим.

Доступ до елементів об'єднання здійснюється тим же способом, що і до структур. Тобто за допомогою крапки (.) здійснюється прямий вибір компонентів, а за допомогою стрілки (–>) – непрямий вибір компонентів об’єднання. Тег об'єднання може бути формалізований точно так само, як і тег структури.

Об'єднання застосовуються для наступних цілей:

- ініціалізації використовуваного об'єкта пам'яті, якщо в кожен момент часу тільки один об'єкт із багатьох є активним;

- інтерпретації основного зображення об'єкта одного типу, так ніби цьому об'єкту був присвоєний інший тип.

Пам'ять, що відповідає змінній типу об'єднання, визначається величиною, необхідною для розміщення найдовшого елемента об'єднання. Коли використовується елемент меншої довжини, то змінна типу об'єднання може містити невикористовувану пам'ять. Всі елементи об'єднання зберігаються в одній і тій же області пам'яті, починаючи з однієї адреси.

Приклад:

union { char fio[30];

char adres[80];

int vozrast;

int telefon; } inform;

union { int ax;

char al[2]; } ua;

При використанні об'єкта inform типу union можна обробляти тільки той елемент який одержав значення, тобто після присвоєння значення елементу inform.fio, не має змісту звертатися до інших елементів. Об'єднання ua дозволяє одержати окремий доступ до молодшого ua.al[0] і до старшого ua.al[1] байта двохбайтового числа ua.ax .