Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯВУ лекции.doc
Скачиваний:
18
Добавлен:
27.10.2018
Размер:
592.38 Кб
Скачать

Адресный тип. Указатели

Указатель - это переменная, в которой хранится адрес памяти, указывающий на начало размещения некоторых данных в памяти.

Указатели применяют для определения адреса в памяти конкретного объекта, например какой-либо переменной или подпрограммы.

Указатели бывают типизированными и нетипизированными.

Типизированный указатель — это указатель, который ссылается на данные определенного типа и указан при объявлении указателя или типа указателя.

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

Type

<имя_типа>=^<тип_данных>;

Нетипизированный указатель — это указатель, который содержит адрес произвольной области памяти, то есть ссылается на данные любого типа.

Для объявления нетипизированного указателя используется слово pointer.

Для получения адреса переменной или подпрограммы используется операция получения адреса @ или стандартная функция addr(X).

Для указателя применяется специальное значение Nil, которое означает, что указатель не содержит адреса.

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

Для указателей применимы операции отношения = и <>.

Пример:

Var A:byte;

P:^byte;

...

P:=@A;

P^:=5; // то же, что A:=5;

Динамические переменные

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

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

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

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

Процедура New(var p:Pointer) выделяет место в динамической области памяти для размещения динамической переменной p^ и ее адрес присваивает указателю p.

Процедура Dispose(var p:Pointer) освобождает участок памяти, выделенный для размещения динамической переменной процедурой New, и значение указателя p становится неопределенным.

Процедура GetMem(var p:Pointer; size:Integer) выделяет участок памяти и присваивает адрес его начала указателю p, размер участка в байтах задается параметром size.

Процедура FreeMem(var p:Pointer[; size:Integer]) освобождает участок памяти, адрес начала которого определен указателем p, а размер - параметром size. Значение указателя p становится неопределенным.