Создание и удаление динамических переменных
В соответствии с двумя типами указателей существуют и две разные процедуры создания динамических переменных.
Память под любую динамически размещаемую переменную выделяется процедурой NEW.Параметром обращения к этой процедуре является типизированный указатель. В результате обращения указатель приобретает значение, соответствующее адресу, начиная с которого можно разместить данные, например:
Var
p1, p2: ^integer;
P3: ^real;
Begin
New(p1);
New(p2);
…
End;
После того, как указатель приобретает некоторое значение, т.е. указывает на конкретный физический байт памяти, по этому адресу можно разместить любое значение соответствующего типа. Для этого сразу за указателем без пробелов ставится значок ^, например:
p1^:= 2;{в область параметра p1 помещено значение 2}
p2^:= 2*pi;{в область параметра p2 помещено значение 6.28}
Если за указателем нет значка ^, то имеется в виду адрес, по которому размещены данные.
Динамически размещаемые данные можно использовать в любом месте программы, где это допустимо для констант и переменных соответствующего типа, например:
p3^:= sqr(p3^) + 17;--------------- так можно
p3:= sqr(p3^) + 17;--------------- так нельзя.
Для выделения динамической памяти переменным, параметром которых является нетипизированный указатель, используется процедура GETMEM(P,Size). Параметр Size задает размер памяти, которую необходимо выделить, в байтах. Размер Sizeне должен превышать 64 Кбайт.
Динамические переменные не имеют собственного имени, в процедурах выделения памяти задаются имена указателей соответствующего типа.
Динамическую память можно не только забирать из кучи, но и возвращать в нее. Для типизированных указателей используется процедура DISPOSE, например операторы
Dispose(p1);
Dispose(p3);
вернут в кучупамять, которая была закреплена за указателями p1и p3.
Длянетипизированных указателейиспользуется процедураFREEMEM(P,Size), которая освобождает Size байтов, начиная с адреса P.
Пример программы с применением динамической переменной:
var
ps: ^string;
begin
new(ps);
ps^:= 'Введена строка для примера с указателем ';
writeln(ps^);
dispose(ps);
end.
При работе с динамическими переменными следует знать:
1. Прежде всего, программа должна разместить в памяти динамическую переменную (процедуры New(P), getmem(P,Size));
2. Каждый вызов процедуры getmem(P,Size) должен сопровождаться вызовом процедуры freemem(P,Size);
3. Процедуру Dispose(P) (освобождение памяти) следует вызывать сразу после того, как только отпадет необходимость в динамической переменной;
4. После применения к указателю процедуры Dispose(P), обязательно следует присвоить указателю значение Nil, т.к. После освобождения памяти указатели автоматически не обнуляются и, фактически указывают на несуществующую переменную. Эта встроенная константа представляет собой значение "нулевого" указателя, который ни на что не указывает;
5. При обращении к значению динамической переменной применяется символ ^ (p^:= 25;), а к адресу динамической переменной этот символ опускается;
6. Динамические переменные используются в основном в двух ситуациях: для работы с массивами больших размеров и для работы с особыми структурами переменных размеров (динамические структуры данных);
Лекция № 23. Динамические объекты – линейные списки
Фундаментальной структурой в ОП следует считать массивы, но они имеют недостаток – память под массив выделяется в полном объеме от начала и до конца выполнения программы, размеры памяти, как известно, ограничены. Файлы предоставляют уникальные возможности обработки больших объемов информации, но работа с файлом выполняется медленно.
В поисках решения этих проблем были предложены динамические структуры данных. Они характеризуются следующими особенностями:
- Для отдельных элементов структуры память выделяется в тот момент, когда в них появляется необходимость (а не всем элементам сразу);
- Число элементов динамической структуры заранее не объявляется и может изменяться от нуля до некоторого значения, определяемого объемом памяти или спецификой задачи;
- Память, занимаемая структурой, не представляет непрерывную область, т.е. элементы структуры могут быть разбросаны в памяти хаотически;
- Логическая последовательность элементов задается в явном виде с помощью указателей, хранящихся в самих элементах. Каждый элемент, кроме своего значения, хранит указатель на следующий элемент или на два соседних элемента.
Рассмотрим наиболее распространенную динамическую структуру – связанный список.
Связанный список – это такая структура данных, элементами которой служат записи одного и того же формата, связанные друг с другом с помощью указателей, расположенных в самих элементах. Элементы списка называют узлами.
Каждый элемент списка состоит из двух различных по назначению частей: содержательной (информационной) и указующей. В содержательной части хранятся данные. Если указующаячасть хранит адрес одного соседнего элемента, то такой список называется односвязным, или однонаправленным. Поле указателя последнего элемента содержит специальный признак NIL (признак конца списка). Для каждого элемента (кроме последнего) имеется единственный следующий элемент, поэтому связанные списки иногда называют линейными. В случае, когда в указующей части хранятся адреса и предыдущего, и следующего элементов, список называется двусвязным или двунаправленным.
Сегмент данных Указатель на первый элемент |
Динамически распределяемая память . . . . инфор- указующ- мацион- ая часть ная часть |
nil |
Дата добавления: 2017-11-04; просмотров: 1518;