Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab2_TP.doc
Скачиваний:
2
Добавлен:
06.09.2019
Размер:
170.5 Кб
Скачать

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]