- •Рекурсия. Виды. Особенности.
- •Прямая Рекурсия. Рекурсивное определение значение факториала
- •Косвенная Рекурсия. Опережающее описание.
- •Сортировка массивов. Типы сортировок.
- •Метод прямого обмена ..Пузырька
- •Метод прямого выбора:
- •Метод прямого включения
- •Алгоритмы поиска. Линейный поиск
- •Алгоритмы поиска. Поиск делением пополам
- •Статические и динамические переменные.
- •Указатели. Типы.
- •Доступ к переменной по указателю - разыменование указателя
- •Стандартные процедуры и функции управления динамической памятью
- •Динамические структуры данных: стек, очередь, список и их особенности.
- •Список. Типы списков. Операции над списками.
- •Выбор нового текущего элемента в списке.
- •Вывод всех элементов из списка.
- •Добавление нового элемента справа от текущего в списке.
- •Удаление текущего элемента из списка
- •Список.Удаление элемента справа от текущего.
- •Стек. Операции над стеком.
Указатели. Типы.
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.
Два указателя равны только в том случае, если они ссылаются на один и тот же объект.
Доступ к переменной по указателю - разыменование указателя
Правило разыменования таково: для того чтобы по указателю на переменную получить доступ к самой переменной, нужно после переменной-указателя поставить знак ^.
Так: Writeln(Int2^) означает напечатать значение переменной, на которую ссылается указатель Int2.
Чтобы увеличить значение переменной на 2, на которую указывает указатель Р, используется косвенный доступ к переменной по указателю: Р ^:= P^ + 2.
Разыменование допускается для любых ссылочных типов. В случае использования указателя на указатель возможно многократное разыменование. Разыменование считается некорректным, если ссылочная переменная имеет значение Nil
Стандартные процедуры и функции управления динамической памятью
Динамическую память можно использовать в операциях, допустимых для величин соответствующих типа
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;