Ptr Преобразует базовый адрес сегмента и смещение в значение типа указатель
Seg Возвращает сегмент для заданного объекта
SPtr Возвращает текущее значение регистра SP
Sseg Возвращает текущее значение регистра SS
Основные действия над динамическими переменными - создание и уничтожение - реализуются в Турбо Паскале стандартными процедурами New и Dispose.
Процедура New предназначена для создания динамических переменных определенного типа. Она отводит новую область памяти в куче для данной динамической переменной и сохраняет адрес этой области в переменной-указателя. Можно присвоить значение переменной-указателю и с помощью оператора @ или функции Ptr. Оператор @ устанавливает переменную-указатель на область памяти, содержащую существующую переменную, включая и те переменные, которые имеют идентификаторы. Функция Ptr устанавливает переменную-указатель на определенный адрес в памяти. Например:
New(Int1);
P1 := @X;
Ptr($40, $49);
Для освобождения памяти в куче предназначена процедура Dispose с параметром указатель на динамическую переменную, причем эта переменная должна быть ранее размещена в куче посредством New, а тип размещенной переменной должен совпадать с базовым типом параметра процедуры Dispose. Например: Dispose(Int1) освобождает выделенный в предыдущем примере в куче фрагмент памяти так, что его можно снова использовать, если потребуется.
Если в программе не предполагается использование кучи, то при работе с программой Турбо Паскаля рекомендуется снизить потребность в памяти для создаваемой программы с помощью меню Options/Heap.
При освобождении динамической памяти нужно соблюдать осторожность, т.е. пользоваться либо New/Dispose, либо New/Mark/Release, либо GetMem/FreeMem, но ни в коем случае не путать сочетание этих процедур.
Пример программы с использованием динамической памяти
{Программа указателя на массив, доступа к элементам массива}
Program Point1;
Uses Crt;
Type
massiv=array[1..10] of integer; {описание типа массива из 10 целых чисел}
Var
i:integer;
a:massiv; {массив из 10 целых чисел}
PtrMas:^massiv;{указатель на массив}
Begin
{ввод элементов массива}
Writeln('Введите элементы массива : ');
for i:=1 to 10 do
begin
Writeln(i,'-й элемент массива ');
Readln(a[i]);
end;
ClrScr;
Writeln('Введенный массив: ');
{вывод элементов введенного массива }
for i:=1 to 10 do
Write(' ',a[i]);
Writeln;
{Присвоить указателю PtrMas адрес начала размещения массива в памяти}
PtrMas:=@a;
Writeln('Значение первого элемента массива, на который указывает PtrMas: ');
{Напечатать значение первого элемента массива, на который указывает указатель PtrMas}
Writeln(PtrMas^[1]);
{Присвоить указателю PtrMas адрес начала размещения второго элемента массива}
PtrMas:=@a[2];
Writeln(' Значение второго элемента массива, на который указывает указатель PtrMas: ');
{Напечатать значение первого элемента массива, на который указывает указатель PtrMas}
Writeln(PtrMas^[1]);
Writeln(' Значение 4-того элемента массива, на который указывает указатель PtrMas: ');
{Присвоить указателю PtrMas адрес 4-того элемента массива}
PtrMas:=Ptr(Seg(a[3]),Ofs(a[3])+SizeOf(integer));
{Ptr- преобразует базовый адрес сегмента и смещения в значение типа указатель}
{Напечатать значение 1 элемента массива, на который указывает указатель PtrMas}