В IBM PC-совместимых компьютерах память условно разделена на сегменты. Компилятор формирует сегменты кода, данных и стека, а остальная доступная программе память называется динамической, или хипом.
Динамические переменные создаются в хипе во время выполнения программы. Обращение к ним осуществляется через указатели. С помощью указателей и динамических переменных реализуют динамические структуры данных.
Указатели
Указателем называется переменная, предназначенная для хранения адресов областей памяти. В указателе можно хранить адрес данных или программного кода. Адрес занимает четыре байта и хранится в виде двух слов, одно из которых определяет сегмент, второе — смещение.
Указатели делятся на стандартные и определяемые программистом. Величины стандартного типа pointer предназначены для хранения адресов данных произвольного типа: var р: pointer;
Программист может определить указатель на данные или подпрограмму конкретного типа. Как и для других нестандартных типов, это делается в разделе type:
type pword = Aword; {читается как «указатель на word"}.
var pw: pword;
Такие указатели называются типизированными. Можно описать указатель на любой тип данных, кроме файловых. Тип указателя на данные можно описать и непосредственно при описании переменной: var pw: Aword;
Для указателей определены только операции проверки на равенство и неравенство и присваивания.
Указатели присваиваются согласно следующим правилам.
- 1. Любому указателю можно присвоить стандартную константу nil, которая означает, что указатель не ссылается на какую-либо конкретную ячейку памяти.
- 2. Указатели стандартного типа pointer совместимы с указателями любого типа.
- 3. Указателю на конкретный тип данных можно присвоить только значение указателя того же или стандартного типа.
Операция @ и функция addr позволяют получить адрес переменной:
var х: word; {переменная}.
pw: Aword; {указатель на величины типа word}.
pw:= @w; {или pw:= addr (w);}.
Для обращения к значению переменной, адрес которой хранится в указателе, примеряется операция разадресации (разыменования0, обозначаемая с помощью символа А: pwA:= 2; inc (pwA); writeln (pwA);
С величинами, адрес которых хранится в указателе, можно выполнять любые действия, допустимые для значений этого типа.
Стандартными функциями для работы с указателями являются:
- ? addr (x): pointer — возвращает адресх (аналогично операции @), гдех — имя переменной или подпрограммы;
- ? seg (x): word — возвращает адрес сегмента для х;
- ? ofs (х): word — возвращает смещение для х;
- • cseg: word — возвращает значение регистра сегмента кода CS;
- ? dseg: word — возвращает значение регистра сегмента данных DS;
- ? ptr (seg, ofs: word): pointer — по заданному сегменту и смещению формирует адрес типа pointer.