Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП / ООП_Лекции.doc
Скачиваний:
50
Добавлен:
08.06.2015
Размер:
1.03 Mб
Скачать

Указатели

Указатель является величиной, указывающей на некоторый адрес в памяти, где хранятся какие-то данные. Указатели быва­ют типизированные, указывающие на данные определенного типа, и нетипизированные (типа pointer), которые могут указы­вать на данные произвольного типа. Чаще всего указатели испо­льзуются для работы с объектами в динамически распределяе­мой области памяти, особенно при работе с запи­сями.

В Object Pascal имеется ряд предопределенных типов указате­лей. Это прежде всего типы указателей на строки: РAnsiChar и PWideChar, представляющие собой соответственно указатели на значения AnsiChar и WideChar. Имеется также родовой тип PChar, определяющий указатель на Char (т.е. пока указываю­щий на AnsiChar). Эти указатели используются при работе со строками с нулевым символом в конце.

Тип указателя

Тип переменной, на которую указывает указатель

PAnsiString, PString

AnsiString

PByte Array

ByteArray (объявлен в модуле SysUtils). Используется для доступа к динамически размещаемым массивам

PCurrency

Currency

PExtended

Extended

POleVariant

OleVariant

PShortString

ShortString

PTextBuf

TextBuf (объявлен в модуле SysUtils). Внутренний тип буфера в запей файлов TTextRec

PVarRec

TVarRec (объявлен в модуле System)

PVariant

Variant

PWideString

WideString

PWordArray

TWordArray (объявлен в модуле SysUtils). Использу­ется для доступа к динамически размещаемым мас­сивам 2-байтных величин

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

type <имя типа указателя> = ^<тип данных>;

Например, предложения:

type Pint = ^integer;

var PI, P2: Pint;

объявляют тип Pint указателя на величину типа integer и две пе­ременные Р1 и Р2, являющиеся указателями на значения типа integer. Однако, надо понимать, что объявление переменных Р1 и Р2 не создает самих величин, на которые они указывают. Вы­деляется только память под хранение указателей, но сами эти указатели ни на что не указывают. Имеется предопределенная константа nil, которая обычно присваивается указателям, кото­рые в данный момент ни на что не указывают.

Чтобы получить доступ к данным, на которые указывает ти­пизированный указатель, надо применить операцию его разыме­нования. Она записывается с помощью символа ^, помещаемого после указателя. Например, если переменная Р1 является указа­телем приведенного выше типа Pint, то выражение Р1^ — это та целая величина, на которую указывает указатель Р1. Если I — переменная целого типа, то после выполнения оператора

Р1^ := I;

Р1 начнет указывать на переменную I и выражение Р1^ будет возвращать значение этой переменной. Того же результата мож­но добиться операцией адресации. Например, приведенный выше оператор можно заменить эквивалентным ему оператором

Р1 := @1;

Этот оператор присваивает указателю Р1 адрес переменной I.

Таким образом, применение операций разыменования или ад­ресации — один из способов присвоить указателю ссылку на кон­кретную область памяти. Другой, более распространенный спо­соб — применение процедуры new, которая выде­ляет память под переменную соответствующего типа и присваи­вает указателю ссылку на эту область. Например, оператор

new(PI);

выделит память для хранения целого значения и присвоит указа­телю Р1 ссылку на это значение.

Операция разыменования не применима к указателям типа po­inter. Чтобы разыменовать указатель pointer, надо сначала приве­сти его к другому типу указателя. Например, если указатель Р объявлен как указатель типа pointer, то выражение PInt(P) приведет его тип к объявленному выше типу Pint, после чего его можно будет разыменовывать. Таким образом, с помощью операции приведения типа можно записать такие операторы:

Pint(Р):=Р1;

I := Pint(Р)^ + Р2^;

Указатели широко используются в Object Pascal и Delphi, при­чем часто неявно для пользователя. Например,

  • для передачи пара­метров по ссылке в процедуры и функции;

  • для обработки строк;

  • для динамического распределения памяти;

  • для работы с за­писями.

Соседние файлы в папке ООП