Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на языке Паскаль в среде Turbo Pascal версии 6 и 7 (Курс лекций). Воронов Г.И.Санкт-Петербург 2010г.doc
Скачиваний:
64
Добавлен:
15.04.2015
Размер:
754.69 Кб
Скачать

Глава 10. Динамические переменные (списки) Понятие динамических переменных

Переменные, которые описываются в разделе описаний (VAR), называются статическими. Память для них выделяется перед началом выполнения программы, и во время выполнения программы не может быть изменена. По окончании программы, эта выделенная память автоматически освобождается.

Однако, статические переменные в Паскале не могут в сумме превышать 64 килобайта оперативной памяти. Кроме того, уже при составлении программы необходимо предусмотреть выделение памяти на максимально возможное количество данных, так как заранее требуемый объем данных может быть не известен.

Для устранения этих недостатков можно использовать динамическое выделение памяти под данные в процессе выполнения программы. Такая динамически выделяемая память размещается уже за пределами статического сегмента, и по объему ограничена только размерами свободной памяти ЭВМ.

Переменные, которые размещаются в этой памяти, называются динамическими. У них нет имен и для обращения к ним используются указатели – статические переменные адресного типа (или, что то же самое, ссылочного типа).

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

<типуказатель> ::= ^<идентификатор базового типа>

где символ ^  признак ссылочного типа;

<идентификатор базового типа>  описанное ранее или стандартное имя типа.

Пример описания <типуказатель>:

Type

mas=array[1..100] of real; {тип массив вещественных чисел}

dinmas=^mas; {тип указатель для значений переменных типа mas}

Переменные ссылочного типа вводятся, как и другие переменные, путем перечисления их имен в разделе описания переменных с указанием типа.

Var

Pj:^integer; {указатель целого числа}

Pc:^char; {указатель символа}

Pd:dinmas; {указатель массива}

Описание ссылочной переменной отводит в памяти место (4 байта) для размещения ссылки. При этом ссылочной переменной никакого значения (в том числе Nil) не присваивается.

Для приведенного примера описания динамических переменных Pj, Pc, и Pd значениями этих переменных в дальнейшем будут, соответственно адреса данных каких-нибудь переменных базовых типов: соответственно целых, символьных и массива вещественных чисел.

Динамические переменные базового типа не имеют имен. В качестве имени для них используются конструкции вида:

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

Например: Pj^, Pc^, Pd^.

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

Записав в него адрес существующей статической переменной, получив его операцией @ : Pj:=@N; конечно, тип переменной должен соответствовать базовому типу, использованному для описания Pj.

Присваиванием значения другого указателя того же типа или стандартного значения nil.

Присваиванием указателю адреса вновь выделенного места в оперативной памяти – то есть адреса начала динамической переменной.

Динамическое выделение памяти можно осуществить с помощью процедуры New(Pj), где Pj  переменная типа указатель (ссылка). Эта процедура выделяет память для размещения значений динамической переменной базового типа и присваивает указателю значение адреса выделенной области памяти.

*

Объект типа Рj

New(Pj);Pj

Чтобы обратиться к динамической переменной, необходимо применить операцию "разыменования" к указателю на эту переменную, используя знак операции "^" после имени указателя. Например, после выделения области памяти для хранения значений динамической переменной, ей можно присвоить значение оператором:

3

*

Pj^:=3; Pj

Чтобы освободить выделенную область памяти для использования другими динамическими переменными нужно воспользоваться процедурой Dispose(Pj), которая является обратной, по отношению к процедуре New(Pj):

Dispose(Pj);Pj

После освобождения выделенной памяти необходимо очистить указатель, ссылавшийся на удаленную динамическую переменную. Это выполняется присваиванием указателю "несуществующего" нулевого адреса nil:

Рj:=nil;Pj

Для выделения заданной в байтах области динамической памяти можно так же использовать процедуру GetMem, а для освобождения областей динамической памяти, заданных процедурой GetMem служат процедуры FreeMem, Mark и Release.

При работе с динамическими переменными важно помнить, что любая память, выделенная процедурой New(), должна быть освобождена в программе процедурой Dispose() !