Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Указатель.






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

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

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

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

· Инициализация указателя;

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

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

 

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

 

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

 

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

 

Type

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

//идентификатор типа «указатель» на данные типа word

p1=^word;

// идентификатор типа «указатель» на данные типа char

p2=^char;

//идентификатор типа «указатель» на массив //указателей, ссылающихся на данные типа real

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

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

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

p6=^string[25];

p7=^record

field1: string [15];

field2: real;

End;

 

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

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

Type

...

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

TSt = string[25];

Trec = record

field1: string [15];

field2: real;

End;

Var

p5: ^Tmas;

p6: ^Tst;

p7: ^Trec;

...

 

Особое место отводится типу pointer – не типизированный указатель. Данный тип обеспечивает общее использование указателя на любую основанную на памяти переменную. То есть тот, к которому доступен для ссылки. Например, добавим к вышеописанным переменным, переменную

p8: pointer;

 

тогда можно в теле программы производить следующие операции:

p8: =p7;

p7: =p8;

действие p7: =p6; приведет к ошибке!

 

в свою очередь, не смотря на то что действие

p8: =p6;

p7: =p8;

не приведет к ошибке компилятора, но данные на которые будет ссылаться p7 – будут не верными.

 

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

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

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

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

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

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

 

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

 

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

Type

Tsym=^char;

Tzap=record

field1, field2: real;

End;

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

Var

ch: Tsym;

rec: ^Tzap;

mas: ^Tm;

...

// обращение к динамической переменной типа char,

//запись в эту область символа звездочка

ch^: ='*';

...

//обращение к полю field1 динамической записи, ввод

//в него данных с клавиатуры

readln (rec^.field1);

...

// обращение к элементу mas[5] динамического

//массива, вывод на экран значения указанного

//элемента

writeln (mas[5]^);

...

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

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

Например.

Var

p: pointer;

...

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


 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.008 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал