
- •Показівники Тема: Показівники.
- •Тип показівник
- •Вбудовані засоби
- •Надання значення змінній-показівнику
- •Використання оператора @
- •Addr(X):pointer;
- •Seg(X):word
- •Визволення динамічної змінної
- •Блочне визволення пам'яті
- •1) New/dispose
- •2) New/mark/release
- •3) Getmem/freemem.
- •Структури, побудовані на базі показівників:
- •Варіанти завдань
- •Контрольні запитання.
Показівники Тема: Показівники.
Динамічні структури - структури даних, розмір яких (об'єм пам'яті, що вони займають) може змінюватись у процесі виконання програми.
Для організації таких структур використовуються динамічні змінні, які створюються та знищуються в процесі виконання програми.
Характеризуються:
Ці змінні явно не описуються, до них неможливо звернутись за допомогою ідентифікатора.
Пам'ять для цих змінних не виділяється під час формування коду програми. Вона виділяється у спеціальній області оперативної пам'яті - heap-області (динамічній пам'яті) - тільки під час виконання програми (звідки і назва - динамічні змінні).
Доступ до таких змінних виконується за допомогою показівників (чи посилань), які стають активними після визначення динамічного об'єкту та містять адресу у вигляді <сегмент>:<зміщення>
Показівники можуть містити будь-яку адресу: статичних даних, фрагменту коду програми, стеку і т.і.).
Тип показівник
Type <ідентифікатор>=^<базовий тип>;
<базовий тип> - визначає тип елементів, на які буде вказувати показівник
Тип показівник - визначає множину значень дискретних змінних визначенного типу, на які може посилатись відповідний показівник.
Опис базового типу не обов'язково повинен передувати опису показівника, але повинен міститись у тому ж розділі описування типів.
Звернутись до динамічних змінних можна тільки через показівник (а не через ідентифікатор):
<показівник>^
Вбудовані засоби
Існує зарезервоване константне значення, пов'язане з 'пустим посиланням', яке має ідентифікатор:
NIL ~ <#0>:<#0>
Цей показівник сумісний з будь-яким іншим показівником (будь-якого базового типу), тобто змінній будь-якого типу показівник може бути надане значення NIL.
Паскаль має вбудований тип показівника pointer
Це нетипізований показівник (тобто, не пов'язаний ні з жодним базовим типом і внаслідок цього сумісний з будь-яким типом показівника). Змінній типу pointer може бути надане значення змінної будь-якого типу показівника.
Але звернення до значення такої змінної (i^) може викликати помилку. Використовується для описування формальних параметрів типу показівник у процедурах та функціях.
Константа типу показівник може містити тільки значення NIL
Надання значення змінній-показівнику
Надання показівнику значення іншого показівника.
За допомогою спеціальної процедури, що зв'язує з динамічною змінною область пам'яті у heap-області.
NEW(var p:pointer);
- створює нову динамічну змінну та встановлює на неї показівник.
Фактичний параметр - показівник будь-якого типу. Розмір виділяємого блоку пам'яті відповідає розміру, потрібному для розміщення змінної базового типу (на який посилається показівник).
Посилання на створену у такий спосіб змінну - через відповідний показівник. Якщо при виділенні пам'яті для змінної не вистачило місця - виникає помилка.
За допомогою безпосереднього надання показівнику припустимого значення адреси:
Використання оператора @
@ - унарний оператор, що повертає адресу статичної змінної, процедури чи функції, сумісну з типом NIL (тобто з любим типом показівника):
використання для змінної - повертає адресу цієї змінної у вигляді <сегмент>:<зміщення>
@<ідентифікатор
змінної>
<показівник>
використання для процедури дозволяє отримати точку входу - адресу, з якої починається її виконання. Використовується для надання керування відповідній процедурі чи функції
@<ідентифікатор процедури, функції> <показівник на точку входу>