о - зміщення.
В
Структура адреси осередки на прикладі 20-і розрядної адресації:
В
В
Оголошення покажчиків
Існує два типи вказівників:
1. типізовані (зв'язуються з деяким типом даних);
2. НЕ типізовані (просто зберігають адресу певної ділянки пам'яті). Покажчики оголошуються в розділі опису змінних і в розділі опису типів (Type і Var).
Оголошення типізованих покажчиків.
ім'я: ^ назву типу;
Var: ^ integer;: ^ real;
... = ^ PersonRecord; = Record;: string [20];: byte;: PersonPeinter;;
У OPascal будь-який ідентифікатор або тип, перед його використанням повинен бути попередньо оголошений (виняток зроблено лише для покажчиків, які можуть посилатися на ще не оголошений тип даних). Це пов'язано з тим, що динамічна пам'ять дає можливість організовувати дані у вигляді списку. p align="justify"> Об'ява не типізованих покажчиків.
ім'я: painter;
Var: painter;, p2: ^ byte; [1 байт] 3, p4: ^ real; [ 8 байт]
Типізовані і не типізовані покажчики зберігають значення адрес, однак, значення одного покажчика не завжди можна передавати іншому. У OPascal передавати значення можна тільки між покажчиками, які пов'язані з одним і тим же типом даних, виключення становлять не типізовані покажчики, які сумісні з усіма типами даних. br/>
Var: painter;, p2: ^ byte;, p4: ^ real;
...: = p2;: = p4; 1: = p3;
p4: = p2;
p1: = p1;
p3: = p;
Обнулення покажчика
p: = Nil; - після виконання цієї операції покажчик продовжує займати місце в пам'яті, але вказує в нікуди (тобто ні на одну клітинку).
В
p: = Nil;
В
Виділення та вивільнення динамічної пам'яті
Вся динамічна пам'ять в OPascal розглядається як суцільний масив байт, який називається купа (HEAP). Фізично вона розташовується в старших адресах пам'яті відразу за областю, яку займає код програми. br/>В
При роботі з купою використовуються стандартні, оголошені за замовчуванням змінні:
1. HeapOrg - зберігає адресу початку купи;
2. HeapEnd - зберігає адресу кінця купи;
3. HeapPTR - зберігає адресу початку незайнятого ділянки купи.
Виділення в пам'яті для типізованих покажчиків здійснюється за допомогою процедури New (ім'я покажчика):
Var
p: ^ byte;
New (p);
p ^: = 2;
1. Адміністратор купи переглядає її вміст і якщо є вільний байт - виділяє його, а адреса цього байта записується в змінну (p).
2. Запис числа (2) у вільне місце з адресою (p).
p ^ - разадресація покажчика, тобто звернення до значення зберігається за адресою, яка лежить в (p). p align="justify"> Процедура New виділяє динамічну пам'ять для необхідного покажчика і тільки після цього покажчик можна використовувати. Покажчики можна використовувати тільки в операціях відповідного типу, тобто в операціях з адресами.
Разадресованние покажчики можуть використовуватися в будь-яких виразах і операціях:
Var: ^ byte;: real; (p); ^: = 2;: = SQRT (p ^) +2 * p ^/3
Вивільнення динамічної пам'яті.
Після використання динамічних змінних, пам'ять зайняту ними необхідно вивільнити, для цього використовується процедура dispose (ім'я покажчика):
Dispose (p);
Після процедури dispose вказівником знову можна виділити пам'ять.
Після процедури dispose значення змінної вивільняється, а вказівником присвоюється значення Nil.
При роботі з покажчиками відповідальність за вивільнення пам'яті лягає на програміста, тому що Pascal при завершенні роботи програми, самостійно зайняту пам'ять не вивільняє, це може призвести до утеске динамічної пам'яті. p align="justify"> Для НЕ типізованих покажчиків виділення пам'яті здійс...