Указатель (компьютерное программирование)


Я действительно считаю операторы присваивания и переменные-указатели одними из «самых ценных сокровищ» информатики.

В информатике указатель — это объект во многих языках программирования , который хранит адрес памяти . Это может быть другое значение, расположенное в памяти компьютера , или, в некоторых случаях, то, что отображается в памяти компьютерного оборудования . Указатель ссылается на место в памяти, и получение значения, хранящегося в этом месте, называется разыменованием. указатель. В качестве аналогии номер страницы в указателе книги можно рассматривать как указатель на соответствующую страницу; разыменование такого указателя будет выполняться путем перехода к странице с заданным номером страницы и чтения текста, найденного на этой странице. Фактический формат и содержимое переменной-указателя зависят от базовой архитектуры компьютера .

Использование указателей значительно повышает производительность повторяющихся операций, таких как обход итерируемых структур данных (например , строк , таблиц поиска , управляющих таблиц и древовидных структур). В частности, копирование и разыменование указателей часто намного дешевле с точки зрения времени и пространства, чем копирование и доступ к данным, на которые указывают указатели.

Указатели также используются для хранения адресов точек входа для вызываемых подпрограмм в процедурном программировании и для связывания во время выполнения с библиотеками динамической компоновки (DLL) . В объектно-ориентированном программировании указатели на функции используются для связывания методов , часто с использованием таблиц виртуальных методов .

Указатель — это простая, более конкретная реализация более абстрактного ссылочного типа данных . Некоторые языки, особенно языки низкого уровня , поддерживают некоторые типы указателей, хотя некоторые из них имеют больше ограничений на их использование, чем другие. В то время как «указатель» использовался для обозначения ссылок в целом, он более правильно применяется к структурам данных , интерфейс которых явно позволяет манипулировать указателем (арифметически черезарифметика указателя ) как адрес памяти, в отличие отволшебного файла cookieиливозможности,которая этого не допускает. [ править ]Поскольку указатели позволяют как защищенный, так и незащищенный доступ к адресам памяти, существуют риски, связанные с их использованием, особенно в последнем случае. Примитивные указатели часто хранятся в формате, подобномцелому; однако попытка разыменования или «поиска» такого указателя, значение которого не является допустимым адресом памяти, может привести ксбою(или содержать недопустимые данные). Чтобы облегчить эту потенциальную проблему, с точки зрениябезопасности типов, указатели считаются отдельным типом, параметризованным типом данных, на которые они указывают, даже если базовое представление является целым числом. Также могут быть предприняты другие меры (такие как проверка и проверка границ ), чтобы убедиться, что переменная-указатель содержит значение, которое является одновременно допустимым адресом памяти и находится в числовом диапазоне, который процессор способен адресовать.

В 1955 году украинский ученый -компьютерщик Катерина Ющенко изобрела язык программирования Address , который сделал возможной непрямую адресацию и адреса высшего ранга — аналогичные указателям. Этот язык широко использовался на компьютерах Советского Союза. Однако он был неизвестен за пределами Советского Союза, и обычно Гарольду Лоусону приписывают изобретение указки в 1964 году. [2] В 2000 году Лоусон был удостоен награды Computer Pioneer Award от IEEE за то, что он изобрел указательную переменную и представил эту концепцию в PL/I, тем самым впервые предоставив возможность гибкой обработки связанных списков в универсальный язык высокого уровня». [3]Его основополагающая статья об этих концепциях появилась в июньском выпуске журнала CACM за 1967 г. под названием «Обработка списков PL/I». Согласно Оксфордскому словарю английского языка , слово « указатель » впервые появилось в печати как указатель стека в техническом меморандуме System Development Corporation .


Указатель a, указывающий на адрес памяти, связанный с переменной b . На этой диаграмме вычислительная архитектура использует одно и то же адресное пространство и примитив данных как для указателей, так и для не указателей; такой необходимости быть не должно.