Что именно хранят указатели? (С++)

Я знаю, что указатели хранят адрес значения, на которое они указывают, но если вы отобразите значение указателя непосредственно на экране, вы получите шестнадцатеричное число. Если число-это именно то, что хранит указатель, то при произнесении

pA = pB; //both are pointers

копируешь адрес. Тогда не было бы больших накладных расходов на использование указателей при работе с очень маленькими элементами, такими как ints и bools?

7 ответов


указатель-это, по сути, просто число. Он хранит адрес в ОЗУ, где находятся данные. Сам указатель довольно мал (вероятно, того же размера, что и int на 32-битных архитектур, long на 64-разрядных).

вы правы, хотя это int * не сохранит никакой космос при работе с ints. Но дело не в этом (не каламбур). Указатели есть, так что вы можете иметь ссылки для вещей, а не просто использовать вещи сами себя.


адреса памяти.

Это место в памяти, где другие вещи is.

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


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

Да, есть накладные расходы на доступ к int или bool значение через указатель и напрямую, где процессор можно поставить переменную в реестр. Указатели обычно используются там, где значение косвенности перевешивает любые накладные расходы, т. е. обход массива.

Я имел в виду накладные расходы времени. Не уверен, что OP больше беспокоит пространство или время.


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


на некоторых архитектурах есть дополнительные накладные расходы указателей на символы, потому что архитектура поддерживает только адресные слова (32 - или 64-разрядные значения). Поэтому указатель на символ сохраняется как адрес слова и смещение символа в этом слове. Удаление ссылки на указатель включает в себя извлечение слова, а затем перемещение и маскировку его значения для извлечения символа.


адрес в памяти. Указывает куда-то! :-)


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

переменные в основном места памяти(обычно содержащие некоторые значения), и мы используем некоторый идентификатор (т. е. имена переменных), чтобы ссылаться на это место памяти и использовать значение, присутствующее в этом месте.

для лучшего понимания предположим, что мы хотим, чтобы информация из ячеек памяти присутствовала в некотором месте относительно текущего переменная. Мы можем использовать идентификатор для извлечения информации из соседних ячеек? Нет. Потому что идентификатор (имя переменной) будет давать только значение, содержащееся в этой конкретной ячейке.

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

здесь в игру вступают указатели. Они используются для хранения местоположения этой переменной, чтобы мы могли использовать дополнительная адресная информация при необходимости.

синтаксис: для хранения адреса переменной мы можем просто использовать & (address-of) оператор.

foo = &bar 

здесь foo хранит адрес переменной bar.

теперь, что если мы хотим знать значение по этому адресу?

для этого, мы можем просто использовать * (разыменования) оператор.

value = *foo

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