Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Указатель.
Обращение к участку динамической памяти в программе осуществляется с помощью специальной ссылочной переменной, которая называется указателем (ссылкой). Переменная типа «указатель» содержит адрес размещения участка динамической памяти, с которой связан этот указатель. Компилятор отводит под переменную типа «указатель» четыре байта статической памяти. Обычно указатель, связанный с определенным типом данных, называется типизированным. Однако он может быть и не типизированным, то есть совместимым с указателями любого типа данных. В этом случае указатель называется свободным (несвязанным). Для работы с динамическими переменными в программе должны быть выполнены следующие действия: · Выделение памяти под динамическую переменную; · Инициализация указателя; · Освобождение памяти после использования динамической переменной. Программист должен сам резервировать место, определять значение указателей, освобождать ДП.
Формат описания типа «указатель» следующий:
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; {ошибка! }
|