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

В IBM PC-совместимых компьютерах память условно разделена на сегменты. Компилятор формирует сегменты кода, данных и стека, а остальная доступная программе память называется динамической, или хипом.

Динамические переменные создаются в хипе во время выполнения программы. Обращение к ним осуществляется через указатели. С помощью указателей и динамических переменных реализуют динамические структуры данных.

Указатели

Указателем называется переменная, предназначенная для хранения адресов областей памяти. В указателе можно хранить адрес данных или программного кода. Адрес занимает четыре байта и хранится в виде двух слов, одно из которых определяет сегмент, второе – смещение.

Указатели делятся на стандартные и определяемые программистом. Величины стандартного типа pointer предназначены для хранения адресов данных произвольного типа:

var р : pointer;

Программист может определить указатель на данные или подпрограмму конкретного типа. Как и для других нестандартных типов, это делается в разделе type:

type pword = ^word; {читается как "указатель на word"}

var pw: pword;

Такие указатели называются типизированными. Можно описать указатель на любой тип данных, кроме файловых. Тип указателя на данные можно описать и непосредственно при описании переменной:

var pw: ^word;

Для указателей определены только операции проверки на равенство и неравенство и присваивания.

Указатели присваиваются согласно следующим правилам.

  • 1. Любому указателю можно присвоить стандартную константу nil, которая означает, что указатель не ссылается на какую-либо конкретную ячейку памяти.
  • 2. Указатели стандартного типа pointer совместимы с указателями любого типа.
  • 3. Указателю на конкретный тип данных можно присвоить только значение указателя того же или стандартного типа.

Операция @ и функция addr позволяют получить адрес переменной:

var х: word; {переменная}

pw: ^word; {указатель на величины типа word}

pw:= @w; {или pw:= addr (w);}

Для обращения к значению переменной, адрес которой хранится в указателе, примеряется операция разадресации (разыменования), обозначаемая с помощью символа А:

pw^:= 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.

 
< Пред   СОДЕРЖАНИЕ     След >