Распределение памяти

Во время выполнения программы на Turbo Pascal операционная система выделяет для программы три сегмента: сегмент кода, сегмент данных и сегмент стека. Первые два сегмента не могут занимать более 64 Кбайт памяти. Последний ограничен только аппаратными возможностями компьютера.

Естественно, не для каждой прикладной программы хватит 64 Кбайт памяти для размещения данных. В этих случаях нам на помощь приходит механизм динамического распределения памяти. Область динамически распределяемой памяти занимает всю оставшуюся после размещения всех блоков программы память и называется heap-памятью, или хипом, или кучей.

Операционная система MS - DOS все адресуемое пространство делит на

сегменты. Сегмент - это участок памяти размером 64 К байт. Для задания адреса необходимо определить адрес начала сегмента и смещение относительно начала сегмента.

Программист может сам определить переменные для хранения адресов памяти. Такие переменные называются указателями.

Указатели делятся на стандартные и определяемые программистом.

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

var p: pointer;

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

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

...

var pw: pword;

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

Тип указателя на данные можно описать и непосредственно при описании переменной:

var pw: ^word;

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

· Любому указателю можно присвоить стандартную константу nil, которая означает, что указатель не ссылается на какую-либо конкретную ячейку памяти.

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

· Указателю на конкретный тип данных можно присвоить только значение указателя того же или стандартного типа.

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

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

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

...

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

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

pw^:= 2; inc(pw^); writeln(pw^);

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

Стандартные функции для работы с указателями:

· addr(x): pointer – возвращает адрес х (аналогично операции @), где х — имя переменной или подпрограммы;

· seg (x): word – возвращает адрес сегмента для х;

· ofs (x): word – возвращает смещение для х;

· cseg: word – возвращает значение регистра сегмента кода CS;

· dseg: word – возвращает значение регистра сегмента данных DS;

· ptr (seg, ofs: word): pointer – по заданному сегменту и смещению формирует адрес типа pointer.

Переменные типа указатель не могут быть элементами списка ввода-вывода.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: