Фізичне представлення запису
У пам'яті комп’ютера запис може зберігатися одним із двох способів:
-
у вигляді послідовності полів, що займають безперервну область пам'яті (рис. 1), причому перше поле зберігається у молодших адресах пам'яті. При такій організації досить мати один покажчик на початок області і зсув відносно початку. Це дає економію пам'яті, але зайву витрату часу на обчислення адрес полів запису.
Рис. 1. Представлення в пам'яті змінної типу record у вигляді послідовності полів
-
у вигляді зв'язного списку з покажчиками на значення полів запису. При такій організації має місце швидке звернення до елементів, але дуже неекономічна витрата пам'яті для зберігання.
Структура зберігання в пам'яті зв'язного списку з покажчиками на елементи наведена на рис. 2.
Рис. 2. Представлення в пам'яті змінної типу record у вигляді зв'язного списку.
Для економії об'єму пам'яті, що відводиться під запис, значення деяких його полів зберігаються в самому дескрипторі, замість покажчиків, тоді в дескрипторі мають бути записані відповідні ознаки. Відповідно до загального підходу мови C дескриптор запису (у цій мові записи називаються структурами) не зберігається до виконання програми. Поля структури просто розташовуються в суміжних слотах пам'яті, звернення до окремих полів замінюються на їх адреси ще на етапі компіляції.
Оголошення комбінованих типів
У різних мовах програмування передбачені різні синтаксичні правила для задання комбінованих типів даних. Відповідна БНФ-нотація для мови Pascal має вид:
оголошення запису ::= record список полів : тип {; список полів:тип}end;
список полів ::= ім’я поля{, ім’я поля}
У відповідності із цими правилами, формат оголошення запису має вид:
record
список полів_1 : тип;
. . .
список полів_n : тип;
end;
При цьому порядок указання полів не грає ролі і може бути довільним
Наприклад, оголошення структури stud з компонентами FIO, group, year, adres :
Type
TGroup = (ІP-01, ІP-02);
TStudent = record
FIO : string [50];
group : TGroup;
year : 1980 .. 1989;
adres : string;
end;
var stud : TStudent;
У випадку ієрархічної структури запису, коли, наприклад, однією із характеристик студента є ще й перелік зданих ним іспитів з оцінками, оголошення такого запису може мати вид:
Type
TStudent = record
FIO : string [50];
group : TGroup;
marks : record
Matem, VT, Physic : 2 .. 5;
end;
year : 1980 .. 1989;
adres : string;
end;
Якщо запис є компонентою масиву, наприклад, коли обробляється структура - масив студентів, то відповідне оголошення може бути представлене так:
var group : array [1..25] of TStudent; { група студентів}
Формат опису структури у мові С:
struct тип структури>
{ тип поле_1;
...
тип поле_n; // “;” обов'язково після і перед дужкою }
};
Наприклад,
struct TStudent
{ сhаr FIO[20];
сhаr *group;
int year;
};
Для звертання до структур використовуються змінні та покажчики. Формати їх оголошення:
-
struct тип_структури
{ тип поле_1;
...
тип поле_n;
};
struct тип_структури
{ тип поле_1;
...
тип поле_n;
};
тип_структури змінна;
тип_структури *покажчик;
struct тип_структури
{ тип поле_1;
...
тип поле_n;
}змінна;
struct тип_структури
{ тип поле_1;
...
тип поле_n;
}*покажчик;
При використанні покажчиків, вони повинні бути ініціалізовані:
покажчик =&структурна_змінна.
Наприклад,
-
struct TStudent
{ сhаr FIO[20];
int year;
};
TStudent stud,*рs;
рs = &stud;
struct TStudent
{ сhаr FIO[20];
int year;
} stud,*рs;
рs = &stud;
У мові С структури, як і масиви, можуть оголошуватися і визначатися.
Формати визначення структур:
-
struct тип_структури
{ тип поле_1;
...
тип поле_n;
};
тип_структури змінна = {список значень};
struct тип_структури
{ тип поле_1;
...
тип поле_n;
}змінна={список значень};
Наприклад,
-
struct TStudent
{ сhаr FIO[20];
int year;
};
TStudent stud = {“Іванов”,1985};
struct TStudent
{ сhаr FIO[20];
int year;
} stud ={“Іванов”,1985};