Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Обращение к участку динамической памяти в программе осуществляется с помощью специальной ссылочной переменной, которая называется указателем (ссылкой).
Переменная типа «указатель» содержит адрес размещения участка динамической памяти, с которой связан этот указатель. Компилятор отводит под переменную типа «указатель» четыре байта статической памяти. Обычно указатель, связанный с определенным типом данных, называется типизированным. Однако он может быть и не типизированным, то есть совместимым с указателями любого типа данных. В этом случае указатель называется свободным (несвязанным).
Формат описания типа «указатель» следующий:
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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!