Опис комбінованих типів
У різних мовах програмування передбачені різні синтаксичні правила для задання комбінованих типів даних.
Відповідна РБНФ-нотація для мов С/С++ є наступною:
оголошення_структури = struct [тип_структури]“{“ тип список_полів {; тип список_полів“}“;
список_полів = поле{, поле}
У відповідності із цими правилами, формат оголошення структури у С/С++ має наступний вид:
struct [тип_структури]
{ тип поле_1;
...
тип поле_n; // “;” обов'язково після і перед дужкою ”}”
};
П
ри
цьому порядок вказання полів не грає
ролі і може бути довільним. Наприклад,
struct TStudent
{ сhаr FIO[20];
сhаr *group;
int year;
};
У випадку ієрархічної структури, коли, наприклад, однією із характеристик студента є ще й перелік зданих ним іспитів з оцінками, оголошення такої структури може мати вид:
struct TMarks
{ int KDM;
i
nt
OP;
int Physics;
};
struct TStudent
{ сhаr FIO[20];
сhаr *group;
int year;
сhаr *address;
TMarks marks;
};
Для звертання до структур використовуються змінні та покажчики. Формати їх оголошення у С/С++:
тип_структури змінна; // стандарт С++
struct тип_структури змінна; // стандарт С
тип_структури *покажчик.
При використанні покажчиків, вони повинні бути ініціалізовані:
покажчик = &структурна_змінна.
Наприклад,
TStudent stud,*рs;
рs = &stud;
Під час визначення структурної змінної компілятор мови програмування автоматично виділяє об'єм пам'яті, достатній для зберігання всіх членів структури.
Слід зазначити, що розмір структури не завжди дорівнює сумі розмірів її членів: внаслідок вирівнювання об'єктів різної довжини в структурі можуть з'являтися безіменні "дірки". Так, наприклад, якщо змінна типу char займає один байт, а int - чотири байти, то для структури:
struct
{ char c;
int i;
}
може знадобитися вісім байт, а не п'ять. Обсяг пам'яті, який резервується для змінної структурного типу, можна визначити за допомогою функції
sizeof(тип_структури).
Змінні-структури і покажчики на структури можна оголошувати і безпосередньо при оголошенні структури:
struct [тип_структури]
{ тип поле_1;
...
тип поле_n;
} змінна, *покажчик;
Наприклад,
struct TStudent
{ сhаr FIO[20];
int year;
} stud,*рs;
рs = &stud;
В реальних задач, зазвичай, здійснюється обробка не окремих структур, а їх масивів:
тип_структури ім’я_масиву[кількість_елементів].
Якщо структура є компонентою масиву, наприклад, коли обробляється структура - масив студентів, то відповідне оголошення може бути представлене так:
TStudent group[25].
У мовах С/С++ структури, як і масиви, можуть оголошуватися і визначатися. Статичну структуру можна ініціалізувати, помістивши слідом за її визначенням список ініціалізаторів для її компонент, укладений у фігурні дужки:
-
struct [тип_структури]
{ тип поле_1;
...
тип поле_n;
};
тип_структури змінна = {список_ значень};
struct [тип_структури]
{ тип поле_1;
...
тип поле_n;
} змінна = {список_значень};
Наприклад,
-
struct TStudent
{ сhаr FIO[20];
int year;
};
TStudent stud = {“Іванов”,1995};
struct TStudent
{ сhаr FIO[20];
int year;
} stud = {“Іванов”,1995};
Використання структур в програмі на С/С++ дозволяє працювати з окремими бітами, тобто з розрядами двійкового коду. Для цього використовуються елементи структури типу поля бітів. Формат структури, що містить поля бітів, наступний:
struct [тип_структури]
{ тип поле_1: довжина_в_бітах;
...
тип поле_n: довжина_в_бітах;
};
В якості типу полів можуть використовуватися специфікатори int, unsigned, signed.
