Var p:tpInt; q: tpReal;
p, q - ссылочные переменные. Их значениями являются ссылки или адреса ячеек памяти, в которых может находиться целое или вещественное число соответственно.
Над ссылочными значениями определены операции равенства и неравенства и оператор присваивания. Ссылочные значения не имеют внешнего представления, поэтому из нельзя вводить и выводить.
Переменная ссылочного типа может получить значение двумя способами: в результате оператора присваивания, в результате вызова специальной встроенной процедуры new. В Pascalе есть единственная полиморфная ссылочная константа nil. Константа обозначает несуществующий адрес. С каждой ссылочной переменной связана переменная базового типа, которая в программе обозначается р^. Ссылочные переменные также называют динамическими переменными.
Вопрос №77
Процедуры New и Dispose. Понятие мусора.
Такие переменные в Pascalе называются указательными переменными и появляются в программе после вызова процедуры new. New(p) - 2 байта(p - integer);
p^:=5;
Над переменной p^ можно выполнять все операции допустимые для ее базового типа. Указанную переменную, созданную с помощью процедуры new можно удалить с помощью встроенной процедуры dispose(p). Рассмотрим следующую последовательность вызовов: new(p);
new(p);
В этом случае первая ячейка становится недоступной и называется мусором. В этом случае после вызова первого new необходимо сохранить указатель в другую переменную, иначе блок памяти, выделенный из системного пула свободного памяти, невозможно использовать и невозможно вернуть в системный пул свободной памяти.
В определенный момент времени вся память может быть исчерпана и программа завершится аварийно. Во избежание такой ситуации в операционной системе существуют специальные встроенные алгоритмы, возвращающие недоступную память в системный пул свободной памяти. Таки алгоритмы называются мусорщиками.
Вопрос №78
Представление и обработка динамических списков в Pascalе.
Однонаправленные списки: рассмотрим информационную структуру, элемент которой состоит 2-х полей: Info и поле адреса следующего элемента:
List=^elem;
elem=record
info: Node;
next: List;
end;
var p,q,l: list; x: Node;
begin
new(p);
readln(x); p^.info:=x; l:=p;
while x<><условие> do begin
new(q); readln(x); q^,info:=x; p^.nex:=q; p:=q; end;
Обработка однонаправленного списка: 1) Задание списка;
2) Поиск и обработка элемента с указанными свойствами;
3)Добавление нового элемента.
4) Удаление элемента.
5) Обработка списка в целом.
Двунаправленные списки:
List=^elem;
elem=record
info: Node;
pred, next: list; end;