Delphi. Указатели по простому

В данной статье попробую разобраться с темой указателей. Попробую понять их на самом простом уровне, так как ранее очень мало их использовал.

Что такое указатели и зачем они нужны?

В браузере у нас есть страница, например та, которую вы читаете сейчас, а есть адресная строка со ссылкой на данную страницу, скажем http://digital-flame.ru/2016/02/09/delphi-ukazateli-po-prostomu/. Если проводить аналогию, то указатель это ссылка на страницу, а сама страница это данные, на которые ссылается указатель.

Теперь перенесемся в мир Windows – есть адресное пространство программы. В этом адресном пространстве хранятся данные, используемые программой. Когда мы объявляем переменную, это адресное пространство задействуется и используется какая-то его часть.

Если переменная занимает немного места, то производить с ней операции достаточно легко, скажем перемещать из одного места адресного пространства в другое. Так переменная integer занимает всего 4 байта и для подавляющего большинства современных компьютеров манипуляции с переменными такого размера легки.

Но что делать если наша переменная занимает несколько десятков мегабайт? Скажем фотография, или аудиофайл? Тут становятся очевидными издержки транзакций с такими переменными. Скажем, у нас список из таких переменных, например TObjectList. Отсортировать такой список будет накладно, даже при учете наиболее оптимального алгоритма сортировки, скажем быстрой сортировки.

Здесь и выходят на сцену указатели. Они созданы для того, чтобы лишь хранить информацию о местонахождении самих данных. Манипуляции с ними легки, так как указатели занимают как правило считанные байты (в 32 разрядных системах – 4 байта, в 64 разрядных – 8 байт).

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

Какие виды указателей бывают?

Нетипизированный указатель

Я бы сказал так, что все указатели, которые не объявлены как Pointer – типизированные указатели. Рассмотрим примеры ниже.

Типизированный указатель (на примере integer)

Типизированный указатель (на примере записи – структуры данных)

Как узнать адрес переменных, на которые указывают указатели?

В самом простом примере это будет выглядеть так…

Для нетипизированного указателя

Для типизированного указателя точно также

Как пользоваться указателями?

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

Присваивание адреса переменной – основное назначение указателя.

Обнуление указателя

Присвоение указателей

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

Выделение памяти и очистка памяти. Типичный пример использования указателя. Только для типизированных указателей. 

Работа со структурами данных (записями).

Работа с массивами