Каковы официальные названия для операторов *
и &
в контексте указателей? Их, кажется, часто называют, разыменовывают оператор и операцию вычисления адреса соответственно, но к сожалению, раздел по унарным операторам в стандарте не называет их.
Я действительно не хочу называть &
адрес - больше, потому что &
возвращает указатель, не адрес. (см. ниже), стандарт очень соглашается с этим:
Результат унарного
&
оператор является указателем на свой операнд.
Симметрия предлагает назвать &
ссылочный оператор, который является маленьким неудачником из-за коллизии со ссылками в C++. Факт это &
возвращается указатель предлагает оператор указателя. Есть ли какие-либо официальные источники, которые подтвердили бы их (или другой) обозначения?
Указатель является механизмом языка, в то время как адрес является деталью реализации. Адреса не вводятся, в то время как указатели не, за исключением void*
. Kevlin Henney также различает указатели и адреса в Интервью:
C [...] позволяет нам абстрагировать специфические особенности машины до такой степени, что мы говорим об указателях и не адресах. Существует целая загрузка боли, которую Вы больше не должны проходить.
Из черновика C99, по индексу:
*
(косвенный оператор), 6.5.2.1, 6.5.3.2
&
(оператор адреса), 6.3.2.1, 6.5.3.2
Из черновика C ++ 0x, по индексу:
*
, см. оператор косвенного обращения, см. оператор умножения
и
, см. оператор адресации, см. побитовый оператор AND
Он также упоминается в 9.6 / 3 «Оператор адресации &
не должен применяться к битовому полю, поэтому нет указателей на битовые поля.»
(Итак, извините, вам все равно нужно вызвать &
"address-of": p)
Лично меня не волнует настоящее имя, пока другие могут понять, о чем я говорю. Я просто называю *
«звездой», а &
«и». :)
Неправда.
& не возвращает указатель.
Указатель - это переменная типа указателя, которая может использоваться для хранения адреса. У указателя есть собственный адрес, обычно отличный от его значения, которое является адресом, который он содержит.
Таким образом, указатель имеет значение lvalue , а результат & p - нет.
Пример:
int *p, a, b;
p = &b; // valid, p is a pointer
&a = &b; // invalid, address is not a variable. lvalue required
Официальными названиями являются адрес-of (&) (Найдено в 2.3.3. Указатели и массивы) и разыменование (или оператор косвенного обращения) (*) ( Нашел в 5.1.Pointers) операторы.
согласно "Язык программирования C ++", третье издание Бьярна Страуструпа.