Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Паскал.doc
Скачиваний:
4
Добавлен:
21.09.2019
Размер:
1.21 Mб
Скачать

Статичні і динамічні змінні

Дотепер ми мали справу з так називаними статичними даними і статичними змінними. Такі змінні з'являються на початку програми (у розділі описів) і існують до завершення її роботи. Відповідно, пам'ять для змісту цих змінних виділяється при запуску програми і залишається зайнятої увесь час, поки програма працює.

Очевидно, що це не самий раціональний спосіб використання пам'яті комп'ютера. Наприклад, деяка змінна може використовуватися тільки один раз у єдиному операторі великої програми, однак пам'ять, виділена під цю змінну, залишається зайнята увесь час, поки працює програма. А чи не можна зробити так, щоб пам'ять для такої змінної виділялася в момент, коли змінна починає використовуватися, і звільнялася відразу ж по завершенні її використання? І щоб цю пам'ять відразу можна було виділити для інших даних? Виявляється, це цілком реально і саме для цієї мети в Turbo Pascal уведене поняття динамічної пам'яті. Динамічна пам'ять, відома також як купа, розглядається в TurboPascal як масив байтів.

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

Покажчики

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

Покажчики, використовувані в Turbo Pascal, бувають типізовані і нетипізовані. Якщо нетипізований покажчик — це змінна, що містить адресу даних довільного типу, то типізований покажчик містить адресу даних, тип яких обумовлюється при оголошенні даного покажчика.

Нетипізовані покажчики описуються так:

var pp : pointer;

де POINTER— стандартний тип даних;

PP — змінна, що містить адресу пам'яті, за якою можуть зберігатися дані довільного типу.

Що стосується типізованих покажчиків, то їх оголошення в програмах на Turbo Pascal виглядають так:

var

px : ^char;

py : ^integer;

У цьому прикладі описані два типізованих покажчики: PX і PY. значення цих змінних являють собою адреси в оперативній пам'яті, по яких містяться дані типу Char і Integer відповідно. Неважко помітити, що опис типізованого покажчика відрізняється від опису статичної змінний того ж типу тільки тим, що у випадку покажчика перед типом присутній символ "^".

Підсумуємо: коли потрібно скористатися динамічною пам'яттю, у розділі описів з'являється не сама змінна, а покажчик (чи посилання) на неї. У цьому випадку покажчик являє собою звичайну змінну, а змінна, на яку він посилається, — динамічну. При цьому, якщо у виразі повинний бути присутнім покажчик, використовується ідентифікатор, оголошений у розділі описів. От так: PX. Однак, якщо у виразі повинна фігурувати динамічна змінна, на яку посилається покажчик, ідентифікатор покажчика доповнюється символом "^". Така дія називається розіменуванням. Наприклад, PX^. Щоб навчитися користатися покажчиками, абсолютно необхідно засвоїти те, про що йшла мова в даному абзаці.

Ще приклад:

type

DatePointer = ^Date;

Date=record

year : 1900..2100;

month : 1..12;

day : 1..31;

next : DatePointer

end;

var

pd : DatePointer;

Тут оголошений тип DatePointer, що представляє собою покажчик на тип Date, що описує запис. Уважний читач зверне увагу, що тип DatePointer описаний до типу Date, на який він посилається. У той же час одне з полів запису Date належить типу DatePointer. У цілому, у Turbo Pascal не допускається посилатися на ще не описані типи, однак у даному випадку (досить частому, коли приходиться мати справа з покажчиками як ні розташовуй опису, усе одно посилання на ще не описаний тип не уникнути. Тому єдине виключення зроблене для покажчиків: тип покажчика на динамічні дані може бути оголошений до опису самих даних.

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

var

px, py : ^char;pz : ^integer;

У цьому випадку операція присвоювання припустима для покажчиків PX і РУ:

px : =py;

Однак зовсім неприпустимими виявляться оператори:

px : =pz;

чи

pz : =py;

У той же час нетипізований покажчик може бути присутнім в операторі присвоювання в парі з будь-яким типізованим покажчиком. Наприклад, у програмі оголошені покажчики:

var

px : ^char;

py : ^integer;

pz : pointer;

Для цих змінних припустимі оператори присвоювання:

px := pz; py := pz;

pz :=py; pz := px;

Неважко прийти до висновку, що нетипізовані покажчики — дуже зручний засіб перетворення типів даних.