Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по праграм 2 курс.docx
Скачиваний:
13
Добавлен:
23.11.2019
Размер:
56.39 Кб
Скачать
  1. Указатели. Типы.

 TYPE

это переменная, которая в качестве своего значения содержит адрес первого байта памяти, по которому записаны данные. Сам по себе указатель занимает в памяти всего 4 байта. Переменной, на которую указывает указатель, не обязательно присваивать какое-либо имя. К ней можно обращаться через имя указателя, потому она называется ссылочной переменной

типизированный-Указатели, содержащие адрес, по которому записана переменная заранее определенного типа. Для объявления типизированного указателя используется знак ^ (тильда), который помещается перед соответствующим типом.

Для объявления типа указателя Р на целочисленный тип данных следует записать:

Type Р = ^Integer;

Var

Р1, Р2 : Р; {Тип Р введен выше}

R : ^Byte;

Если базовый тип является еще не объявленным идентификатором, то он должен быть объявлен в той же самой части объявления, что и тип указатель:

Например:

Type RecPtr = ^RecordType;

RecordType = record

Name : string[20];

Number : integer;

end;

неипизированный

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

  • Переменные типа Pointer не могут быть разименованы: указание символа ^ после такой переменной вызывает появление ошибки. Значения типа Pointer совместимы со всеми другими типами указателей.

Нулевой (пустой) указатель Nil

Указатель Nil считается константой, совместимой с любым ссылочным типом, поэтому его значение можно присваивать любому указателю. Обычно значение Nil присваивают указателю, когда его указание надо отменить или в начале инициализации программы. Это позволяет проверять значение указателя, прежде чем присваивать ему какое-либо значение

  • Над значениями ссылочных типов допускаются две операции сравнения на равенство и неравенство, например @ Х <> @Y или Р1 = Р2.

  • Два указателя равны только в том случае, если они ссылаются на один и тот же объект.

  1. Доступ к переменной по указателю - разыменование указателя

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

Так: Writeln(Int2^) означает напечатать значение переменной, на которую ссылается указатель Int2.

Чтобы увеличить значение переменной на 2, на которую указывает указатель Р, используется косвенный доступ к переменной по указателю: Р ^:= P^ + 2.

Разыменование допускается для любых ссылочных типов. В случае использования указателя на указатель возможно многократное разыменование. Разыменование считается некорректным, если ссылочная переменная имеет значение Nil

  1. Стандартные процедуры и функции управления динамической памятью

Динамическую память можно использовать в операциях, допустимых для величин соответствующих типа

  • Procedure New(var P:Pointer); – выделяет в динам. памяти участок размера, достаточного для размещения переменной того типа, на который ссылается указатель р, и адрес начала этого участка заносит в этот указатель. Здесь тип Pointer определяет любой указатель на область памяти.

выделяет в динамической памяти участок размера, достаточного для размещения переменной базового типа для заданного типа указателя, и возвращает адрес этого участка

Procedure Dispose(var P:Pointer);

– процедура освобождения динамической памяти, которая ранее была выделена процедурой New для переменной P;

Procedure GetMem(var P:Pointer; Size:Integer);

– процедура выделения блока динамической памяти длиной Size байт и записи адреса начала этой памяти в переменную P.

Procedure FreeMem(var P:Pointer; Size:Integer);

– процедура освобождения динамической памяти, которая ранее была выделена переменной P процедурой GetMem;

Function Addr(X):Ponter

– функция получения адреса или указателя на любую переменную X. Эта функция эквивалентна оператору «@». Можно получить адрес переменной, записав:

P:=Addr(x); или P:=@X;.

Процедура Mark( var p: Pointer ) записывает в указатель p адрес начала участка свободной динамической памяти на момент ее вызова.

Процедура Release( var p: Pointer ) освобождает участок динамической памяти, начиная с адреса, записанного в указатель p процедурой Mark, то есть, очищает ту динамическую память, которая была занята после вызова процедуры Mark.

Функция Sizeof(x) : word возвращает объем в байтах, занимаемый х, причем х может быть либо именем переменной любого типа, либо именем типа.

Type rec = record

D : word;

S :string;

End;

Pword=^word;

Var p1,p2 :pword;

р3: ^rec;