2.2. Породження динамічних об’єктів
При описі змінної вказівникового типу вона не вказує на жодний
програмний об’єкт, лише вводить у використання статичну змінну (наприклад:
P, Q, AM, BM) вказівникового типу. Тобто по цьому опису транслятором лише
виділяється місце у пам’яті машини, необхідне для розміщення вказівника.
Для породження самого динамічного об’єкта є стандартна процедура
NEW (“новий”).
У операторі виклику процедури задається один фактичний параметр –
вказівникова змінна породжуваного об’єкта. Наприклад:
NEW(P); NEW(Q);
У результаті виконання цієї процедури породжується новий об’єкт такого
типу, який вказаний при описі вказівникової змінної. Для змінної Р –
динамічний об’єкт цілого типу; для змінної Q – динамічний об’єкт, елементами
якого є символ.
Змінним P та Q присвоюється вказівник на ці породжені об’єкти. Тобто у
пам’яті машини резервується місце для породженого об’єкта, а адреса початку
цього місця присвоюється змінним P та Q.
2.3. Змінна із вказівником
При породженні динамічного об’єкта, йому не присвоюється ще ніякого
значення.
Для того, щоб динамічній змінній присвоїти якесь значення або вико-
ристати це значення, вводиться __________поняття “змінна з вказівником”. У
найпростішому випадку – це ім’я змінної вказівникового типу після якого
стоїть стрілка, тобто:
Р↑ – це значення того програмного об’єкта, на який вказує вказівникова
змінна Р.
Після породження динамічних змінних P та Q можна присвоїти їм
початкові значення:
Змінна з вказівником може використовуватися у будь-яких конструкціях
мови. Але тут треба звертати увагу на тип вказівникової змінної.
Не можна записати:
P := P↑+Q↑;
Оскільки змінна Р – цілого типу, а Q – символьного, крім того Р↑ – це
значення об’єкта, а Р – вказівник на нього, тобто адреса.
Але якщо опишемо у нашій програмі змінну S цілого типу, то такі оператори
будуть правильними:
S := S + P↑; P↑:= P↑ DIV 5; AM[P↑+1] := 100;
Змінна вказівникового типу може мати й складнішу форму, наприклад:
TYPE
PS = ↑REAL;
VAR
A : ARRAY [1..20] OF PS;
У цьому випадку маємо послідовність з 20-ти значень вказівникового
типу, до того ж кожна з них вказує на дійсні значення. При такому описі у
програмі будуть фігурувати вказівникові змінні з індексами. Наприклад, А[i],
A[i+2] та відповідні їм змінні з вказівниками:
A[i]↑ та A[i+2]↑
Значення цих змінних будуть дійсного типу: A[2]↑ := 5.44;
2.4. Операції над змінними вказівникового типу
Основне правило: над значеннями вказівникового типу не можна
виконувати ніяких операцій, які давали б результат цього самого типу.
Значення вказівникового типу – це адреса тих чи інших програмних об’єктів і
115
змінювати її на свій розсуд не можна, оскільки розміщенням усіх об’єктів у
пам’яті машини займається транслятор.
До значень вказівникового типу можуть застосовуватись деякі опе-
рації порівняння, а також вони можуть бути операндами в операторі
присвоювання.
У загальному оператор присвоювання має вигляд:
V := E;
де Е – змінна або вираз вказівникового такого самого типу, як і тип змінної V.
У правій частині оператора присвоювання може бути:
1. Пустий вказівник NIL.
2. Вказівникова змінна.
3. Вказівникова функція (тобто функція, результатом якої є вказівник).
Вираз Е повинен мати обов’язково той самий тип, що і змінна V.
Не можна записати:
P := Q;
Оскільки змінна Р може вказувати лише на цілі значення, а змінна Q на
значення типу CHAR.
Для ілюстрації виконання операторів присвоювання опишемо дві вказів-
никові змінні:
VAR P, D : ↑INTEGER;
Після виконання оператора P := D (рис. 1, в) на динамічний об’єкт із
значенням 5 не вказує жодний вказівник – він став недоступним для програми,
хоч місце у пам’яті займає.
З іншого боку, виконання цього оператора не призвело до породження
нового динамічного об’єкта. Просто змінна Р буде вказувати на той самий
об’єкт, що і змінна D. Таким чином на об’єкт із значенням 25 будуть вказувати
два вказівники Р та D.
Після виконання оператора D := NIL (рис. 1, г) розривається зв’язок D з
об’єктом 25 і на нього буде вказувати лише змінна Р.
