Лекция: Указатель.

 

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

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

Формат описания типа «указатель» следующий:

 

TYPE<идентификатор указателя>=^<тип>;

 

Примеры объявления типов «указатель» и переменных типа «указатель».

 

Type

{правильные объявления типов}

p1=^word;{ p1 — идентификатор типа «указатель» на данные типа word.}

p2=^char; { p2 — идентификатор типа «указатель» на данные типа char}

p4=array[1..10] of ^real; {p4 — идентификатор типа «указатель» на массив указателей, ссылающихся на данные типа real}

{неправильные объявления типов}

p5=^array[1..10] of real;

p6=^string[25];

p7=^record

field1: string [15];

field2: real;

End;

 

В формате объявления типа «указатель» должен быть указан идентификатор типа, поэтому стандартные идентификаторы (integer, real и т.д.) можно указывать непосредственно в описаниях типа «указатель». Ошибки в описаниях типов p5, p6 и p7 будут отмечены компилятором из-за того, что, в таких случаях надо прежде описать идентификатор типа, а затем использовать его в других описаниях.

Следующие описания будут правильными:

Type

...

mas = array[1..10] of real;

st = string[25];

rec = record

field1: string [15];

field2: real;

End;

Var

p5: ^mas;

p6: ^st;

p7: ^rec;

...

Указатель может находиться в одном из трех состояний, а именно:

1) еще не инициализирован;

2) содержит адрес размещения;

3) содержит значение предопределенной константы nil; такой указатель называется пустым, то есть не указывает ни на какую переменную. Указатель со значением nilсодержит 0 в каждом из четырех байтов.

Указатели можно сравнивать с другими указателями ( =, <> ), присваивать им адрес или значение другого указателя, передавать как параметр. Указатель нельзя отпечатать или вывести на экран.

Обращение к выделенной динамический памяти кодируется следующим образом:

 

<идентификатор указателя>^

 

Рассмотрим пример обращения к переменным, размещенным в динамической памяти:

Type

sym=^char;

zap=record

field1, field2: real;

End;

m=array[0..9] of word;

Var

ch: sym;

rec: ^zap;

mas: ^m;

...

ch^:='*'; {обращение к динамической переменной типа char, запись в эту область символа звездочка}

...

Readln (rec^.field1); {обращение к полю field1 динамической записи, ввод в него данных с клавиатуры }

...

Writeln ( mas[5]^); {обращение к элементу mas[5] динамического массива, вывод на экран значения указанного элемента}

...

Фактически можно говорить, что ch^, rec^.field1иmas[5]^ исполняют роль имён динамических объектов в программе, адреса которых хранятся в указателях сh, rec и mas соответственно.

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

Например.

Var

p:pointer;

...

p^:=1; {ошибка!}


 

еще рефераты
Еще работы по информатике