Действия над указателями

Понятие указателя

Рис. 9. Схема формирования адреса

Фрагмент памяти размером 16 байт называется параграфом, следовательно, сегмент адресует память с точностью до параграфа, а смещение – с точностью до байта. Адреса принято записывать в 16-ричном формате.

Можно получить адрес ячейки оперативной памяти, отсчитанный от начала памяти, т.е. от адреса 0000: 0000. Такой адрес называется сплошным, его элементом хранения является число типа LongInt.

Сплошной адрес = СЕГМЕНТ * 16 + СМЕЩЕНИЕ.

Существует понятие нормализованного адреса, у которого смещение находится в диапазоне 0..15 ($0000..$000F). Сплошной адрес переводится в нормализованный формат следующим образом:

СЕГМЕНТ = Сплошной адрес div 16,

СМЕЩЕНИЕ = Сплошной адрес mod 16.

Указание связано с использованием ссылочного или указательного типа. Указатель – это особый объект, в элементе хранения которого могут содержаться адреса любых других объектов. Таким образом, константами ссылочного типа являются адреса ячеек оперативной памяти и особое значение указателя - NIL, которое не указывает ни на один из существующих в программе объектов. Мощность ссылочного типа определяется адресным пространством оперативной памяти. Размер элемента хранения ссылочного типа равен размеру элемента хранения адреса и составляет 4 байта.

Sizeof(Pointer_Type) = 4 (байта).

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

Type PPoint = ^ Point; { указатели на объекты типа ТОЧКА }
Type PCircle = ^ Circle; { указатели на объекты типа ОКРУЖНОСТЬ }

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

Var pp: PPoint; pc: PCircle;

ПРИСВАИВАНИЕ

Присваивание для указателей сводится к пересылке значения одного указателя другому. Совместимыми по присваиванию являются:

¨ два указателя одного и того же типа;

¨ константа NIL и свободный указатель;

¨ константа NIL и ограниченный указатель любого типа;

¨ свободный указатель и ограниченный указатель любого типа.

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

Каждый указатель перед использованием необходимо инициализировать, т.е. установить на соответствующий объект.

Установка указателя на объект, адрес которого неизвестен, производится с помощью встроенной функции взятия адреса – Addr(), аргументом которой является идентификатор объекта. Эта функция возвращает результат типа Pointer, в котором содержится адрес аргумента. Аналогичный результат возвращает операция @.

Type PPoint = ^ Point; Point = record X, Y: word end; PCircle = ^ Circle; Circle = record R: word; Center: Point end;   { тип - указатели на объекты типа ТОЧКА } { тип ТОЧКА } { тип - указатели на объекты типа ОКРУЖНОСТЬ } { тип ОКРУЖНОСТЬ }
Var op: Point; pp: PPoint; oc: Circle; pc: PCircle;   { объект ТОЧКА } { объект – указатель на объект ТОЧКА } { объект ОКРУЖНОСТЬ } { объект – указатель на объект ОКРУЖНОСТЬ }
begin op.X:=100; op.Y:=200; pp:= @op; pc:= addr (oc);   { заполнение атрибутов объекта ТОЧКА} { установка указателя на объект ТОЧКА } { установка указателя на объект ОКРУЖНОСТЬ }
with oc do begin R:=5; with Center do begin X:=10; Y:=20 end; end; { заполнение атрибутов объекта ОКРУЖНОСТЬ }

Установка указателя на объект, адрес которого известен и хранится в другом указателе, производится с помощью присваивания.

Var

pp, pp1, pp2: PPoint; pc: PCircle; p: Pointer;

begin

pp1:= pp; p:= pc; pp2:= nil;

Результат выполнения этих операций иллюстрируется рис. 10.

       
 
   
 



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: