Что именно хранят указатели? (С++)
Я знаю, что указатели хранят адрес значения, на которое они указывают, но если вы отобразите значение указателя непосредственно на экране, вы получите шестнадцатеричное число. Если число-это именно то, что хранит указатель, то при произнесении
pA = pB; //both are pointers
копируешь адрес. Тогда не было бы больших накладных расходов на использование указателей при работе с очень маленькими элементами, такими как int
s и bool
s?
7 ответов
указатель-это, по сути, просто число. Он хранит адрес в ОЗУ, где находятся данные. Сам указатель довольно мал (вероятно, того же размера, что и int
на 32-битных архитектур, long
на 64-разрядных).
вы правы, хотя это int *
не сохранит никакой космос при работе с int
s. Но дело не в этом (не каламбур). Указатели есть, так что вы можете иметь ссылки для вещей, а не просто использовать вещи сами себя.
адреса памяти.
Это место в памяти, где другие вещи is.
указатели, как правило, размер слова процессора, поэтому они обычно могут быть перемещены в одном цикле команд. Короче говоря, они быстры.
как говорили другие, указатель хранит адрес памяти ,который является "просто числом", но это абстракция. В зависимости от архитектуры процессора это может быть несколько чисел, например база и смещение, которые необходимо добавить к разыменованию указателя. В этом случае накладные расходы немного выше, чем если адрес является одним номером.
Да, есть накладные расходы на доступ к int или bool значение через указатель и напрямую, где процессор можно поставить переменную в реестр. Указатели обычно используются там, где значение косвенности перевешивает любые накладные расходы, т. е. обход массива.
Я имел в виду накладные расходы времени. Не уверен, что OP больше беспокоит пространство или время.
номер ссылается на свой адрес в памяти. Размер указателя обычно является собственным размером архитектуры компьютера, поэтому нет дополнительных накладных расходов по сравнению с любым другим примитивным типом.
на некоторых архитектурах есть дополнительные накладные расходы указателей на символы, потому что архитектура поддерживает только адресные слова (32 - или 64-разрядные значения). Поэтому указатель на символ сохраняется как адрес слова и смещение символа в этом слове. Удаление ссылки на указатель включает в себя извлечение слова, а затем перемещение и маскировку его значения для извлечения символа.
позвольте мне начать с основ. Прежде всего, вы должны знать, что такое переменные и как они используются.
переменные в основном места памяти(обычно содержащие некоторые значения), и мы используем некоторый идентификатор (т. е. имена переменных), чтобы ссылаться на это место памяти и использовать значение, присутствующее в этом месте.
для лучшего понимания предположим, что мы хотим, чтобы информация из ячеек памяти присутствовала в некотором месте относительно текущего переменная. Мы можем использовать идентификатор для извлечения информации из соседних ячеек? Нет. Потому что идентификатор (имя переменной) будет давать только значение, содержащееся в этой конкретной ячейке.
но, если каким-то образом мы можем получить адрес памяти, на котором эта переменная присутствует, то мы можем легко перемещаться в близлежащие местоположения и использовать их информацию(во время выполнения).
здесь в игру вступают указатели. Они используются для хранения местоположения этой переменной, чтобы мы могли использовать дополнительная адресная информация при необходимости.
синтаксис: для хранения адреса переменной мы можем просто использовать & (address-of) оператор.
foo = &bar
здесь foo хранит адрес переменной bar.
теперь, что если мы хотим знать значение по этому адресу?
для этого, мы можем просто использовать * (разыменования) оператор.
value = *foo
теперь, когда мы должны хранить адрес переменной, нам понадобится память так же, как нам нужно в случае переменной. Это означает, что указатели также хранятся в памяти так же, как и другие переменные, поэтому, как и в случае переменных, мы также можем сохранить адрес указателя в еще один указатель.