Указатель – это переменная, множество значений которой состоит из адресов ячеек памяти и специального значения – нулевого адреса. Нулевой адрес обозначает, что указатель никуда не указывает, т.е. он пустой.
В языках высокого уровня указательный тип применяется для организации работы с динамической памятью.
Динамическая память – это память, выделяемая в куче (англ. heap) непосредственно в процессе работы приложения. В отличии от статической, которая выделяется при инициализации приложения, динамическая память может быть выделена и перераспределена в любой момент функционирования приложения с помощью специальных команд.
Существуют два типа указателей:
- общий (нетипизированный) указатель;.
- типизированный указатель.
Примечание: Нетипизированные указатели в Pascal не используются для изменения памяти, так как работа с ними не является безопасной, поэтому далее, встретив слово «указатель» необходимо понимать, что речь идет именно о типизированных указателях
Для работы с указателями введены дополнительные операции:
- @<имя> - операция взятия адреса – возвращает адрес, с которым ассоциировано <имя> (пример в листинге 2);
- <имя указателя>^ - операция разыменования, т.е. обращение к переменной, на которую указывает типизированный указатель.
Примеры использования операций описаны в листинге 2.
Листинг 2. Объявление и использование указателей
program listing_2;
uses crt; (* подключаем библиотеку *)
var p1,p2: ^integer; { так можно объявить типизированный указатель,
в данном случае два указателя на целое}
i: integer;
begin
clrscr; (* очистка экрана *)
i :=1; { инициализируем переменную некоторым значением}
p1 := @i; { записываем в указатель адрес переменной, т.е.
теперь указатель ссылается на ячейку памяти,
в которой расположено значение переменной i }
i :=2; { меняем значение переменной i }
p2^ := 4; { инициализируем указатель с помощью операции
разыменования: 1. В памяти выделяется ячейка памяти
в которую помещается 4;
2. В p2 записывается адрес этой ячейки}
writeln(p1^,p2^) { Будет выведено: 24}
end.
С использованием указателей и динамической памяти реализуются структура данных линейный список.