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