Реализация динамических структур средствами языков высокого уровня

В 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.
 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >