- •Системное программное обеспечение (pascal)
- •2. Статические и динамические структуры
- •3. Динамическое размещение данных
- •4. Указатели
- •4.1. Описание указателя.
- •4.2. Выделение динамической памяти.
- •4.3. Задание значения указателю.
- •4.4. Операция разыменования.
- •4.5. Освобождение динамической памяти.
- •4.5.3. Освобождение фрагментов динамической памяти.
- •5. Динамическая структура – список
- •5.1. Линейные списки.
- •5.1.1. Особенности линейных списков.
- •5.1.2. Линейный односвязный список.
- •6.1.2. Основные операции над стеком.
- •7. Обратная польская запись (постфиксная запись) и ее использование
- •7.1. Обратная польская запись.
- •7.2. Метод Дейкстра.
- •7.2.1. Приоритеты операций.
- •7.2.2. Использование стека.
- •II. Контрольные вопросы
- •III. Последовательность выполнения индивидуального задания.
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.
4.5.3. Освобождение фрагментов динамической памяти.
Для освобождения целого фрагмента динамической памяти (занятого несколькими данными) перед началом выделения памяти, т. е. до применения процедур New или GetMem, в переменной-указателе запоминается текущее значение указателя HeapPtr с помощью процедуры
Mark(<идентификатор_указателя>)
Для освобождения фрагмента кучи, начиная от того адреса, который запомнила процедура Mark, и до конца динамической памяти определена процедура
Release(<идентификатор_указателя>),
Var
P: Pointer;
P1, P2: ^integer;
begin
Mark(P);
GetMem(P1, …);
New(P2);
…
Release(P);
end.
Вызов Release уничтожает список свободных фрагментов в куче, которые могли быть созданы до этого процедурами Dispose или FreeMem, поэтому не следует использовать одновременно механизм освобождения памяти с помощью процедур FreeMem, Dispose и Release.
5. Динамическая структура – список
К динамическим структурам относятся линейные связанные структуры, которые представляют собой последовательности, в которых должно соблюдаться условие: каждый элемент имеет не более одного предшествующего и одного последующего элемента. Порядок элементов в таких структурах задается не индексами элементов (как в массиве), а указателями, входящими в состав элементов структуры.
5.1. Линейные списки.
Линейный список представляет собой дискретную, связанную, динамическую, рекурсивную информационную структуру.
5.1.1. Особенности линейных списков.
Списки состоят из элементов одного и того же типа.
Связь между элементами и доступ к элементам списка осуществляется при помощи указателей, поэтому, кроме информационных данных, каждый элемент списка должен иметь указатели на последующий или/и предшествующий элемент списка.
Количество элементов списка заранее не задаётся, оно может изменяться в процессе выполнения программы.
Размер одного элемента списка не может превышать 64 Кбайт.
При описании списка используется рекурсия.
Доступ к элементам списка последовательный.
Списки могут быть линейными (односвязными и двусвязными) и циклическими (односвязными или двусвязными).