Pascal Указатели Динамические переменные

Слайд 2

Для выделения памяти типизирован-ному указателю служит стандартная процедура new(): New (P);

Для выделения памяти типизирован-ному указателю служит стандартная процедура new():
New

(P); где P – имя указателя;
[new можно исп. и в виде функции]
Но для указателя типа Pointer исп.:
Getmem (P; Size);
где Size - к-во байт памяти.
За одно обращение к куче getmem может зарезервировать 65 521 байт памяти.
Для освобождения памяти, выделенной процедурой (функцией) new(), исп.:
Dispose (P);
От getmem освобождает память
Freemem (P; Size);
После освобождения памяти значение указателя становится неопределенным, поэтому во избежание проблем его лучше сразу же "обнулить":
dispose(p);
p:= nil;

Динамические переменные

И+ПРГ

Слайд 3

Динамические переменные Для освобождения памяти одновремен-но из-под нескольких переменных применяют процедуры:

Динамические переменные

Для освобождения памяти одновремен-но из-под нескольких переменных применяют процедуры:
Mark

(P);
она вызывается до начала выделения памяти и записывает в указатель P адрес начала динамической памяти (из переменной HeapOrg). Затем можно процедурой
Release (P);
освободить участок памяти занятый до момента вызова release, начиная с адреса записанного в mark.
Вспомогательные функции:
Maxavail – длина в байтах самого длинного свободного участка памяти
(тип функции longint),
Memavail – полный объем свободной динамической памяти в байтах
(тип функции longint),
Sizeof (X) – объем в байтах занимае-мый X, где X – либо имя переменной любого типа, либо имя типа
(тип функции word).

И+ПРГ

Слайд 4

Указатели на процедуры и функции Указатели на подпрограмму являются переменной процедурного

Указатели на процедуры и функции

Указатели на подпрограмму являются переменной процедурного (функциональ-ного)

типа:
Имя функции (процедуры) – это константа процедурного типа, поэтому присваивание происходит без операции взятия адреса @ , т.к. в этом типе имя подпрограммы - и есть адрес точки входа в неё.
type fun = function (x : real) : real;
var pf : fun;
(* конкретная функция *)
function f (x : real) : real : far;
Begin
……………………… (* тело функции *)
End;
pf := f;
В переменной pf теперь содержится адрес точки входа в функцию f, и можно вызывать её так: y := pf(x);
Функция должна компилироваться в режиме дальней адресации - far, ведь адрес должен содержать сегмент и смещение, а без far – одно смещение, т.к. компилятор формирует всего один сегмент кода.

И+ПРГ