Покажчики

Покажчик – це змінна, що містить адресу іншої змінної, тобто вказує на неї.
Всі покажчики діляться на типізовані та нетипізовані.
Типізовані покажчики вказують на змінні певних наперед визначених типів.
Нетипізовані покажчики можуть вказувати на змінні будь-яких типів.
Для опису типізованих покажчиків використовується символ ^.
Наприклад:
var p1:^integer;{покажчик на змінну типу integer}
p2:^real;{покажчик на змінну типу real}
Для опису нетипізованих покажчиків використовують ключове слово pointer.
Наприклад:
var p:pointer;
Нетипізовані покажчики зручно використовувати, якщо треба виконувати якісь операції з адресами змінних різних типів.
Наприклад:
var p1:^integer;
p2:^real;
pp:pointer; … pp:=p1; p2:=pp;{допустима операція а пряме виконання p2:=p1 -недопустиме} Покажчики можуть вказувати на дані любого допустимого у Паскалі типу крім файлового.  Основне призначення покажчиків – це динамічне керування пам’яттю.
Як уже говорилося, покажчик - це змінна, яка містить адресу деякої області пам’яті або змінної. Це дає можливість виділяти додаткову пам’ять при необхідності і звільняти її, коли така необхідність минає.
Для виділення пам’яті в Паскалі існують такі процедури :
new(var p:^<тип>) – виділяє пам’ять під змінну заданого типу.
Адреса виділеної області пам’яті зберігається у типізованому покажчику p. Покажчик повинен бути попередньо описаний, як покажчик на даний тип;
getmem(var p:pointer;size:word) – виділяє область пам’яті заданого розміру size, для збереження нетипізованих даних. Адреса виділеної області записується у нетипізований покажчик p.
Для звільнення пам’яті, що була виділена за допомогою процедур new та getmem необхідно використовувати наступні процедури:
dispose(var p:^<тип>) – звільнює пам’ять виділену процедурою new. Типи вказані при виділенні і при звільненні пам’яті повинні співпадати;
freemem(var p:pointer; size:word) – звільнює область пам’яті розміром size, виділену процедурою getmem. Розмір size при виділенні пам’яті і при звільненні повинен співпадати. Крім того для зручності роботи з динамічною пам’яттю в Паскалі є дві функції, що дозволяють перевірити наявність в системі вільної пам’яті, доступної для динамічного виділення:
function maxavail : longint – функція, яка повертає розмір найбільшої неперервної області вільної пам’яті, доступної для динамічного розподілу. Цей розмір відповідає максимальному розміру динамічної змінної, яка може бути розміщена у пам’яті в даний момент часу;
function memavail : longint – функція, яка повертає сумарний розмір вільної пам’яті, доступної для динамічного розподілу.
Використання динамічного розподілу пам’яті дозволяє значно підвищити ефективність використання оперативної пам’яті. Після того, як пам’ять  виділена, над нею можна виконувати ті ж дії, що і над звичайною змінною. Після звільнення пам’яті вона стає доступною для повторного використання при роботі з іншими даними. Для використання області пам’яті, на яку вказує покажчик, застосовують символ ^, що розміщується після імені відповідного покажчика, як це показано у нижченаведеному прикладі:
var i,j:^integer;{описуємо два покажчики на змінні цілого типу}
 r:^real;{описуємо покажчик на змінну дійсного типу}
 k:integer; d:real;
begin new(i);{виділяємо область пам’яті під змінну цілого типу і вказує на цю область}
new(j);{ виділяємо ще одну область пам’яті під змінну цілого типу j вказує на цю область }
new(r);{ виділяємо область пам’яті під змінну дійсного типу r вказує на цю область } 
i^:=5;{записуємо число 5 у область пам’яті на яку вказує i}
 j^:=i^*2;{ записуємо число 10 у область пам’яті на яку вказує j}
 k:=i^+j^;{k:=5+10;} 
r^:=pi;{записуємо 3.14 до області пам’яті, на яку вказує покажчик r} 
d:=sqrt(r^);
 dispose(r);{звільнення пам’яті на яку вказує r. Ця пам’ять стає доступною для іншого використання}
 dispose(j);{ звільнення пам’яті на яку вказує j. Ця пам’ять стає доступною для іншого використання }
 dispose(i);{ звільнення пам’яті на яку вказує i. Ця пам’ять стає доступною для іншого використання }
end.

Немає коментарів:

Дописати коментар