
- •Лекция. Указатели Лекция. Указатели.
- •Указатели и динамическая память
- •2 Элемент списка
- •Операция взятия адреса @»
- •Сравнение указателей
- •Динамическая память.
- •Адресация памяти в компьютере
- •Выделение и освобождение динамической памяти.
- •Процедуры и функции для работы с динамической памятью.
- •9 ©Кащей Владимир Васильевич, миэт, каф. Иувс, тел. (095) 532-9882
Лекция. Указатели Лекция. Указатели.
©Кащей Владимир Васильевич, МИЭТ, каф. ИУВС, тел. (095) 532-9882
Указатели и динамическая память
Все рассмотренные нами ранее типы данных содержат непосредственно данные. Теперь мы приступаем к изучению принципиально нового типа, содержащего совершенно другой тип информации – адрес области оперативной памяти, в которой хранятся данные.
Определение Указатель – переменная, содержащая адрес области памяти, в которой располагаются некоторые данные.
Указатель указывает на данные как, например, адресная книга содержит адрес (ссылку) для определенного человека или оглавление указывает номер страницы заголовка.
В Турбо-паскале указатели могут быть 2 типов:
1. типизированные,
2. нетипизированные.
Типизированные указатели содержат адрес области памяти, в которой содержатся данные определенного в программе типа.
Нетипизированные указатели могут указывать на любую область независимо от того, какой тип данных находится в данной области.
Т
базовый тип
Б
идентификатор
типа
Н
pointer
Примеры
1). Var
P1 : ^Integer;
P2 : ^Real;
Type
PersonPointer=^PersonRecord;
PersonRecord=Record
Name : String;
Job : String;
Next : PersonPointer;
End;
Здесь базовый тип PersonRecord является еще не описанным идентификатором. Этот случай является единственным исключением в турбо-паскале, когда еще не определенный тип используется для определения другой переменной. Если бы такое исключение не было сделано, то построение списков было бы невозможно. При этом, однако, этот еще не определенный на данный момент идентификатор должен быть описан в пределах этого блока.
1 элемент списка
указатель
указатель
последний элемент
списка
пусто2 Элемент списка
2). Var
pp : Pointer;
С помощью нетипизированных указателей удобно размещать динамические данные, структура которых изменяется в ходе выполнения программы.
Несмотря на то, что значениями указателей являются адреса памяти, не всякие указатели могут обмениваться значениями друг с другом, а только такие, которые связаны с одним и тем же типом данных.
Пример.
Var
P1,p2 : ^Integer;
P3 : ^Real;
Pp : Pointer;
В этом случае p1:=p2 допустимо, а p1:=p3 – запрещено, так как p1 и p3 указывают на различные типы данных. Однако, такие ограничения не распространяются на нетипизированные указатели. То есть можно написать pp:=p3; p1:=pp, но что при этом получится? Получается, что устанавливаются ограничения и сразу же предоставляются средства для их обхода.
Значением переменной указателя может быть адрес, указывающий на переменную или Nil (пустое значение).
Если у нас имеется динамическая переменная и если на нее указывает переменная-указатель, то такая ссылка записывается в виде переменной-указателя, после которой ставится символ указателя (^).
Примеры: P1^, PersonPointer^.Name
Переменной-указателю можно присвоить значение:
С помощью процедуры New, которая отводит новую область памяти в динамически распределяемой области для динамических переменных и сохраняет этот адрес в значении переменной указателя.
С помощью операции взятия адреса @, которая ориентирует переменную указателя на область памяти, содержащую существующую переменную, в том числе и переменную, имеющую идентификатор.
С помощью функции Ptr, ориентирующей переменную на определенный адрес в памяти.