Я знаю, что адрес ссылочного Переменные не может быть изменен раз набора,
литература не имеет ничего общего с адресами. Не думайте о ссылках как о специальных указателях.
Если вы не говорите о том, как компилятор может использовать ссылки. Но это совершенно другой уровень абстракции. На уровне программиста на C++ вы не смотрите на язык с той же точки зрения, что и писатель-компилятор; нет такой вещи, как «адрес ссылочной переменной». Объекты имеют адреса, а ссылка - это просто другой способ назвать объект.
Или, как мне нравится объяснять это новичкам, ссылка is объект.
но когда я запустил команду, как меняется значение моей ссылки, но примерно такой же?
В следующей строке:
int &ref = a; //&ref is 0x28fee
Вы объявляете ref
быть ссылка на a
. Используя объяснение сверху, ref
is a
. Поэтому, когда вы затем продолжаете и записываете &ref
(используя символ &
, чтобы вызвать адрес-оператора, вместо объявления ссылки), то, что происходит, эквивалентно тому, что происходит при записи &a
. Поэтому неудивительно, что результат идентичен. Это один и тот же объект, поэтому адрес должен быть одинаковым.
ref = b; //value of ref = 5, address is still 0x28fee
Это то же самое, как написание a = b;
. Он присваивает значение b
a
, потому что ref
- это еще один способ сказать a
. При присвоении значений int
s адреса не изменяются.
Наконец, это правильно считать, что знак «&» это же тот, который мы использовать в указатели?
Нет, совсем нет. Повторяя мою мысль сверху: &
имеет разные значения в C++. Вы используете его для объявления ссылок или для получения адресов объектов. На самом деле, есть еще больше значений, считая, что &
также является битовым оператором И, как и в a & b
. Пары &
, то есть &&
, расширьте список возможных значений, чтобы включить логический оператор И и ссылки на значения C++ 11 rvalue.
С педагогической точки зрения, это, конечно, жаль, что &
перегружен для справочных деклараций и адрес-оператора. Насколько мне известно, &
был выбран для ссылок, потому что тогда было сложно добавить новые ключевые слова (например, ref
) на C++, поскольку обратная совместимость с C была огромной проблемой в то время, и добавление ref
в качестве ключевого слова означало бы что код C, такой как int ref = 0;
, больше не будет компилироваться.
C++ должен был ввести хотя бы некоторые новые ключевые слова (например, throw
), но в некоторых случаях это было технически возможно и/или политически необходимо обойтись без них.
Непонимание может заключаться в том, что вы считаете, что принимаете адрес переменной *, что неверно. Скорее, вы берете адрес * значения * (точнее, из glvalue), а значение, полученное путем оценки ссылки, является привязкой к ссылке. –
Ссылка не должна фактически храниться в памяти. Даже сказать, что это адрес, не совсем правильно. В вышеприведенном коде компилятор свободен, чтобы даже создать ячейку памяти для 'ref' и вместо этого заменить' a' всюду 'ref'. –
ссылка просто переименовывает имя переменной..Reference не имеет памяти. Для получения дополнительной информации посетите эту ссылку http://www.tutorialspoint.com/cplusplus/cpp_references.htm – Shiv