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

1 Способ.

Procedure new (p); где р-параметр типа указатель.

После выполнения этой процедуры переменная р получит значение первой свободной ячейки из «кучи», в которой может разместиться данное того типа, который задан в описании указателя р.

Пример:

Var A, B:^ integer;

C:^ real;

Begin new(A);

new(C);

В первый момент «куча» свободна и переменная heapptr имеет то же значение, что и heaporg (указатель начала «кучи»), т.е. указывает на начало «кучи».

После выполнения процедуры new(А) переменная А получит значение heapptr и по этому адресу будет выделено 2 байта памяти, т.к. А – указатель на тип integer. Таким образом, heapptr увеличивает значение на 2. В результате выполнения процедуры new(C) переменная С получит значение heapptr. И heapptr увеличит свое значение на 6, т.к. С – указатель на тип real. В итоге heapptr увеличит значение на 8.

2 Способ.

Значение указателя можно изменить с помощью оператора присваивания

<указатель 1>: =<указатель 2>;

при этом необходимо, чтобы оба указателя были одного и того же типа. Действие такого оператора приводит к тому, что <указатель 1> будет указывать на ту же ячейку в «куче», что и <указатель 2>, т.е. будет иметь значением тот же адрес.

Можно написать: А : = В;

В частности, любому указателю можно присвоить стандартное значение пустого адреса: А : = Nil; В результате этого А не будет указывать ни на одну ячейку.

3 Способ.

Присвоить значение переменной - указателю можно использовав процедуру Getmem(p, size); где р – переменная-указатель, а size – переменная целого типа. Эта процедура позволяет выделить в куче область необходимых размеров size и присвоить адрес этой области переменной р.

4 Способ.

Переменной типа указатель можно присвоить значение с помощью оператора задания адреса:

Y : = @ x;

где у – переменная типа указатель, а х – простая переменная. В результате у получает значение адреса ячейки памяти, в которой хранится х.

С помощью такого оператора можно использовать указатель для того, чтобы присвоить значение переменной, на которую он указывает.

Пример: Пусть указатель у указывает на х (у: = @ x;), тогда в результате выполнения оператора y ^ : = 5; значение переменной х будет равно 5, т.е. у^ - это значение, на которое указывает указатель у.

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

Динамической переменной называется переменная, память для которой выделяется во время работы программы.

Выделение памяти для динамической переменной осуществляется вызовом процедуры new. После того, как указатель приобрел некоторое конкретное значение, отличное от nil, т.е. стал указывать на конкретный адрес «кучи», по этому адресу может быть размещено значение соответствующего типа.

У динамической переменной нет имени, поэтому обратиться к ней можно только при помощи указателя, т.е. в виде:

<имя указателя>^

Пример: подсчитаем сумму двух динамических переменных.

Program dinam_peremennie;

Var p1, p2, p3:^integer;

Begin new (p1); {создаются переменные типа integer и их адреса

new (p2); присваиваются указателям p1, p2, p3 }

new (p3);

p1^:=10;

p2^:=p1^+1;

p3^:=p1^+p2^;

writeln (‘сумма чисел p1^ и p2^=', p3^);

readln;

end.

Таким образом, значение, на которое указывает указатель, обозначается с помощью крышки ^, поставленной после имени указателя.

Если за именем указателя нет ^ , то это адрес ячейки памяти, если же есть ^, то это значение, которое расположено по данному адресу.

р1^ - значение, на которое указывает указатель р1.

р1 – указатель (адрес ячейки, где расположено число).

Отметим, что нельзя смешивать указатели и данные в одно выражение:

p1:= sqr(p1^); – так делать нельзя!!!

После того, как динамическая переменная стала не нужна, ее можно уничтожить, а освободившиеся ячейки вернуть в «кучу», для этого используется процедура dispose(p); где р – переменная-указатель. После выполнения этой процедуры ячейки, содержащие значение p^ будут считаться свободными, но при этом значение p^ не изменится. Следовательно, использование p^ может привести к порче других динамических переменных, поэтому рекомендуется сразу после обращения к процедуре dispose указателю присвоить : p:= Nil; Процедура dispose(p) предназначена для освобождения указателя, который раньше получил свое значение с помощью процедуры new(p).

В том случае, если указатель имеет тип pointer и получил значение с помощью процедуры Getmem (p, size), тогда для его освобождения используется процедура Freemem (p, size).