- •Історична довідка
- •Характеристика й особливості мови
- •Алфавіт мови
- •Службові (зарезервовані) слова.
- •Структура програми мови Turbo Pascal
- •Розділ оголошень і угод
- •Розділ текстів процедур і функцій
- •Розділ основного блоку програми
- •Процедури введення-виведення. Деякі вбудовані функції Турбо-Паскаля.
- •Функції числових параметрів.
- •Базові управляючі конструкції Турбо-Паскаля Оператори умовного переходу.
- •1. Оператор if.
- •2. Оператор вибору (case)
- •Оператори циклів у Паскалі
- •1. Цикл із післяумовою (Repeat)
- •2. Цикл із предумовою (While)
- •3. Цикл із лічильником або параметром (For)
- •Концепція типів даних. Типи даних в мові Pascal
- •Дійсні типи
- •Бульовий (логічний) тип
- •Символьні і рядкові змінні
- •1. Символьний тип
- •2. Рядковий тип
- •Перерахований та обмежений типи
- •1. Перерахований тип
- •2. Обмежений тип
- •1. Поняття масиву. Одномірні масиви
- •2. Багатомірні масиви
- •3. Сортування і пошук
- •Множинний тип
- •Тип запис
- •Процедури і функції
- •Формальні і фактичні параметри. Механізм параметрів
- •Параметри - значення
- •Параметри-змінні
- •Безтипові параметри
- •Приведення типів.
- •Процедурні типи
- •Рекурсія Рекурсивні визначення
- •Рекурсивні підпрограми
- •Алгоритми з поверненням. Розв’язок задачі про рух коня
- •Алгоритми з поверненням. Розв’язок задачі про вісьмох ферзів
- •If підходить тнеn
- •Модулі в Турбо Паскалі
- •Модуль crt
- •1. Керування екраном
- •2. Робота з клавіатурою
- •3. Інші можливості
- •Графіка в Турбо Паскалі
- •1. Включення і вимикання графічного режиму.
- •2. Побудова елементарних зображень
- •3. Виведення текстової інформації.
- •Файли в мові програмування Pascal
- •Установчі і завершальні операції
- •Операції введення-виведення
- •Обробка помилок введення-виведення
- •Переміщення по файлу
- •Спеціальні операції
- •Текстові файли
- •1. Оголошення файлової змінної і прив'язка до файлу на диску
- •2. Читання даних з файлу
- •3. Запис даних у файл
- •Двійкові файли
- •1. Типізовані файли
- •2. Нетипізовані файли
- •Статичні і динамічні змінні
- •Покажчики
- •Стан покажчика
- •Установка розмірів динамічної пам'яті
- •Сумісність і перетворення посилкових типів
- •Динамічні структури даних
- •Динамічні змінні: інші види списків, стек і черга.
- •1. Інші види списків
- •2. Стек і черга
- •Дерева і пошук у деревах
- •1. Визначення й описи структур даних
- •1. Масив
- •2. Список
- •3. Дерево
- •2. Алгоритми
- •1. Лінійний пошук у масиві
- •2. Двійковий пошук
- •3. Лінійний пошук у списку
- •Змішані таблиці
- •Об’єктно-орієнтоване програмування. Що таке об’єктно-орієнтоване програмування
- •Інкапсуляція
- •Спадкування
- •Віртуальні методи і поліморфізм
- •Конструктори, динамічні об'єкти і деструктори
- •Поля і методи: сховані і загальнодоступні
- •Системно- залежні розширення
- •Налагодження змінних
- •Оверлеї
- •Переривання і системні виклики
- •Доступ до пам'яті і портів
- •Перевизначення переривань
Статичні і динамічні змінні
Дотепер ми мали справу з так називаними статичними даними і статичними змінними. Такі змінні з'являються на початку програми (у розділі описів) і існують до завершення її роботи. Відповідно, пам'ять для змісту цих змінних виділяється при запуску програми і залишається зайнятої увесь час, поки програма працює.
Очевидно, що це не самий раціональний спосіб використання пам'яті комп'ютера. Наприклад, деяка змінна може використовуватися тільки один раз у єдиному операторі великої програми, однак пам'ять, виділена під цю змінну, залишається зайнята увесь час, поки працює програма. А чи не можна зробити так, щоб пам'ять для такої змінної виділялася в момент, коли змінна починає використовуватися, і звільнялася відразу ж по завершенні її використання? І щоб цю пам'ять відразу можна було виділити для інших даних? Виявляється, це цілком реально і саме для цієї мети в 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;
Неважко прийти до висновку, що нетипізовані покажчики — дуже зручний засіб перетворення типів даних.