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

Процедурные типы.

Существуют два процедурных типа: тип-процедура и тип-функция. Описание процедурного типа имеет вид:

type <имя процедурного типа> =

<заголовок процедуры или функции без имени>;

Например:

type funcl = function (a, b : real) : real;

Процедурные типы широко применяются в Object Pascal при использовании классов.

1.5 Динамическая память и указатели

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

Однако часто приходится обрабатывать данные, количество которых и их тип заранее не известны. В этом случае удобно использовать динамическую память. Динамическая память (куча) ­– эта та оперативная память компьютера, которая выделяется программе в процессе её выполнения. Использование динамической памяти позволяет экономить ресурсы памяти компьютера: в начале там могут быть размещены одни переменные, а затем они могут быть удалены и на их месте размещены другие.

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

Типизированный указатель может хранить адрес переменной определённого типа. Описывается указатель, как и любая другая статическая переменная, в разделе var:

var <имя указателя> : ^ <тип> ;

Например,

var p1, p2 : ^integer; p3 : ^real;

Здесь p1 и p2 – указатели на переменные типа integer, а p3 – указатель на переменную типа real.

Указателю может быть присвоено пустое значение nil , например p1:=nil, означающее, что переменная p1 ни на что не указывает, т.е. не содержит адрес какой-либо ячейки памяти. Как правило, при запуске программы все указатели содержат значение nil.

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

p1:=p2;

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

p1^:=p1^+2;

Адрес любой переменной можно получить с помощью операции взятия адреса @. Например, если L – переменная типа integer, то допустим следующий оператор:

p1:=@L;

Для работы с динамическими переменными в программе должны быть предусмотрены:

 выделение памяти под динамическую переменную;

 присвоение указателю адреса выделенной памяти (инициализация указателя);

 освобождение памяти после использования динамической переменной.

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

Нетипизированный указатель не связан с каким-либо конкретным типом данных. Для описания нетипизированного указателя служит зарезервированное слово pointer, например:

var x: pointer;

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

procedure GetMem(var p:pointer; size:integer);

Резервирует фрагмент динамической памяти требуемого размера size, в переменной p сохраняется адрес начала этого фрагмента.

procedure FreeMem(var p:pointer[; size:integer]);

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]