Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Указатель



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

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

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

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; {ошибка!}





Дата публикования: 2014-11-04; Прочитано: 212 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...