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



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



pA = pB; //both are pointers


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

716   7  

7 ответов:

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

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

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

То есть места в памяти, где другой материал является.

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

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

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

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

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

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

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

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

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

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

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

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

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

foo = &bar 

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

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

Для этого мы можем просто использовать оператор* (разыменование) .
value = *foo

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

Comments

    Ничего не найдено.