- •I. Теоретические сведения.
- •1.1. Понятие модуля.
- •1.2. Использование модуля.
- •1.3. Структура модуля.
- •2. Статические и динамические структуры
- •3. Динамическое размещение данных
- •4. Указатели.
- •4.1. Описание указателя.
- •4.2. Выделение динамической памяти.
- •4.3. Задание значения указателю.
- •4.4. Операция разыменования.
- •4.5. Освобождение динамической памяти.
- •4.5.3. Освобождение фрагментов динамической памяти.
- •5. Динамический массив
- •5.1. Необходимость использования средств работы с динамической памятью при обработке массивов.
- •5.2. Описание интерфейсов для статического и динамического массивов.
- •6. Восходящая отладка программ (снизу вверх)
- •II. Контрольные вопросы.
- •III. Последовательность выполнения индивидуального задания.
- •5. Драйверы запуска подпрограмм
- •IV. Требования к разработке программы.
- •V. Требования к оформлению отчета.
4. Указатели.
Т. к. данные в динамической памяти не имеют собственных идентификаторов, то к ним можно обращаться с помощью указателей.
Указатель – это переменная, которая в качестве своего значения содержит адрес какого-либо байта памяти, который задается совокупностью двух шестнадцатиразрядных слов, называемых сегментом (участок памяти, имеющий длину 64 Кбайт и начинающийся с физического адреса, кратного 16: 0, 16, 32 и т. д.) и смещением (указывает, сколько байт от начала сегмента необходимо пропустить, чтобы обратиться к нужному адресу).
Таким образом, значения указателей представляются в виде двух величин типа Word (сегмент:смещение) и занимают 4 байта. Их нельзя ввести с клавиатуры и вывести на устройства вывода.
Для значений указателей предопределена константа Nil, которая называется пустым указателем, и её значение представляется как 0000:0000.
Существует два вида указателей: типизированные и нетипизированные. Они между собой совместимы, но несовместимы те величины, на которые они указывают. Типизированный указатель содержит адрес переменной определенного типа. Нетипизированный указатель может указывать на переменную любого типа.
4.1. Описание указателя.
4.1.1. Типизированные указатели описываются как
^<имя_базового_типа>;
4.1.2. Нетипизированные указатели описываются с помощью стандартного идентификатора Pointer.
Var
P: Pointer;
4.2. Выделение динамической памяти.
4.2.1. Выделение динамической памяти для данных, связанных с типизированным указателем, – с помощью процедуры
New(<идетификатор_указателя>);
Размер выделяемой области памяти определяется базовым типом переменной, связанной с указателем.
Var
P: ^integer;
begin
New(P);
…
end.
4.2.2. Выделение динамической памяти для данных, связанных с любым видом указателей, – с помощью процедуры
GetMem(<идентификатор_указателя>,<размер_выделяемой_памяти>);
идентификатор_указателя – типизированный или нетипизированный указатель
размер_выделяемой_памяти – величина типа Word, которая определяет количество выделяемой динамической памяти
Память под динамические переменные при использовании процедур New и GetMem выделяется блоками по 8 байт.
Var
P: Pointer;
Begin
GetMem(P,56);
…
end.
4.3. Задание значения указателю.
Указателю можно присвоить содержимое другого указателя совместимого типа, константу NIL (пустой указатель) или адрес объекта, определенный с помощью оператора @, а также функций ADDR и PTR.
4.4. Операция разыменования.
Операция разыменования используется для обращения к значению переменной, адрес которой хранится в указателе.
Обозначается операция разыменования как
<идентификатор_указателя>^;
Она позволяет осуществлять доступ к той области памяти, с которой связан указатель.
4.5. Освобождение динамической памяти.
4.5.1. Освобождение динамической памяти с использованием типизированных указателей определена процедура
Dispose(<идентификатор_указателя>);
Var
P: ^integer;
Begin
New(P);
…
Dispose(P);
end.
После выполнения процедуры Dispose значение типизированного указателя неопределенно, поэтому теряется связь со значением, на которое он указывал.
4.5.2. Освобождение динамической памяти с использованием указателей любого вида определена процедура
FreeMem(<идентификат_указателя>,<размер_освобождаемой_памяти>)
идентификат_указателя – типизированный или нетипизированный указатель
размер_освобождаемой_памяти – величина типа Word, которая определяет количество освобождаемой динамической памяти
Var
P: Pointer;
Begin
GetMem(P,67);
…
FreeMem(P,67);
end.