|
Горбачев Л.И. Основы программирования в среде Turbo Pascal.
[НАЗАД]
[ДАЛЕЕ]
УКАЗАТЕЛИ И ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ.
4. Стандартные процедуры и функции для работы с указателями.
Любым действиям с динамической переменной должна предшествовать
процедура ее размещения в оперативной памяти. Эта процедура имеет следующий
вид: New(var P: pointer);
Она создает новую динамическую переменную, присваивая P значение
адреса ее размещения в оперативной памяти. При этом динамической переменной
отводится блок памяти, соответствующий размеру типа, с которым объявлен
указатель P.
Если в ходе вычислительного процесса динамическая переменная
становится ненужной, ее следует удалять. Это осуществляется с помощью следующей
процедуры: Dispose(var P: pointer);
Данная процедура освобождает память, занятую динамической переменной,
делая значение ее указателя P неопределенным.
Кроме названных процедур Турбо Паскаль (а точнее, модуль System)
поддерживает следующие стандартные процедуры и функции для работы с указателям и
динамическими переменными:
- GetMem(var P: pointer; Size: word); - создает новую
динамическую переменную размером Size байт, устанавливая значение значение
указателя P на начало выделенной ей динамической области оперативной памяти.
Значение Size не может превышать 65521 байт.
- FreeMem(var P: pointer; Size: word); - уничтожает
динамическую переменную, освобождая Size байт. После выполнения процедуры
FreeMem значение P становится неопределенным.
- Mark(var P: pointer); - запоминает состояние
динамической области оперативной памяти в указателе P, для того чтобы в
дальнейшем все динамические переменные, размещенные в оперативной памяти после
выполнения Mark, могли быть уничтожены с помощью Release.
- Release(var P: pointer); - уничтожает все
динамические переменные, размещенных в оперативной памяти после указателя P.
Значение указателя P формируется обычно с помощью процедуры Mark.
- MaxAvail: longint; - возвращает размер (в байтах) наибольшего непрерывного
блока в динамической области оперативной памяти, где может быть размещена (New
или GetMem) динамическая переменная.
- MemAvail: longint; - возвращает размер (в байтах) свободной области в
динамической памяти.
Пример: Использование FreeMem, GetMem, MaxAvail и
MemAvail. [program Memory]
В ряде случаев при работе с указателями полезными являются следующие
функции:
- Addr(X): pointer; - возвращает адрес (указатель) объекта X, где X - любая
переменная, имя процедуры или функции.
- CSeg: word; - возвращает текущее значение регистра CS (адрес сегмента кода,
из которого вызвана CSeg).
- DSeg: word; - возвращает текущее значение регистра DS (адрес сегмента
данных).
- Ofs(X): word; - возвращает значение смещения в адресе аргумента X, где X -
любая переменная, имя процедуры или функции.
- Ptr(Seg, Ofs: word): pointer; - преобразует адрес, заданный в виде базового
сегмента (Seg) и смещения (Ofs), в значение типа pointer.
- Seg(X): word; - возвращает сегментную часть адреса объекта X, где X - любая
переменная, имя процедуры или функции.
- SPtr: word; - возвращает текущее значение регистра SP.
- SSeg: word; - возвращает текущее значение регистра SS.
Пример:
Использование CSeg, DSeg, SSeg, SPtr, Ofs и Seg. [program
Adress]
[НАЗАД]
[ДАЛЕЕ]
|
|