2016-04-02 2 views
2

Я только что нашел контрольные переменные и у меня есть несколько вопросов, которые меня раздражают. См. Код ниже.адрес и значение ссылочной переменной C++

int a = 3;  //&a is 0x28fee 
int b = 5;  //&b is 0x16faa 
int &ref = a; //&ref is 0x28fee 
ref = b;  //value of ref = 5, address is still 0x28fee 

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

И поскольку адрес тот же, что и значение ref, все равно должно быть 3, или, может быть, не должно меняться значение 5, потому что как один адрес может иметь 2 значения.

И, наконец, правильно ли считать, что знак «&» тот же, что мы используем в указателях?

+0

Непонимание может заключаться в том, что вы считаете, что принимаете адрес переменной *, что неверно. Скорее, вы берете адрес * значения * (точнее, из glvalue), а значение, полученное путем оценки ссылки, является привязкой к ссылке. –

+1

Ссылка не должна фактически храниться в памяти. Даже сказать, что это адрес, не совсем правильно. В вышеприведенном коде компилятор свободен, чтобы даже создать ячейку памяти для 'ref' и вместо этого заменить' a' всюду 'ref'. –

+0

ссылка просто переименовывает имя переменной..Reference не имеет памяти. Для получения дополнительной информации посетите эту ссылку http://www.tutorialspoint.com/cplusplus/cpp_references.htm – Shiv

ответ

5

Я знаю, что адрес ссылочного Переменные не может быть изменен раз набора,

литература не имеет ничего общего с адресами. Не думайте о ссылках как о специальных указателях.

Если вы не говорите о том, как компилятор может использовать ссылки. Но это совершенно другой уровень абстракции. На уровне программиста на 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;. Он присваивает значение ba, потому что ref - это еще один способ сказать a. При присвоении значений int s адреса не изменяются.

Наконец, это правильно считать, что знак «&» это же тот, который мы использовать в указатели?

Нет, совсем нет. Повторяя мою мысль сверху: & имеет разные значения в C++. Вы используете его для объявления ссылок или для получения адресов объектов. На самом деле, есть еще больше значений, считая, что & также является битовым оператором И, как и в a & b. Пары &, то есть &&, расширьте список возможных значений, чтобы включить логический оператор И и ссылки на значения C++ 11 rvalue.


С педагогической точки зрения, это, конечно, жаль, что & перегружен для справочных деклараций и адрес-оператора. Насколько мне известно, & был выбран для ссылок, потому что тогда было сложно добавить новые ключевые слова (например, ref) на C++, поскольку обратная совместимость с C была огромной проблемой в то время, и добавление ref в качестве ключевого слова означало бы что код C, такой как int ref = 0;, больше не будет компилироваться.

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

+0

great asnwer @ChristianHackl, это очистило все мои сомнения, а также дало мне дополнительную информацию на фоне C++. –

3

Когда я запускаю команду, как изменяется значение моей ссылки, но адрес тот же?

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

или, возможно, должны не меняет своей стоимости в 5

это правильно, когда вы меняете значение ссылки ref в вашем примере, вы можете, как хорошо substitiute ref к a, поэтому у вас есть a = b ,

И, наконец, правильно ли считать, что знак «&» тот же, что мы используем в указателях?

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

+0

у вас была правильная идея о моем & вопросе. Я был смущен этой частью больше всего. Спасибо –

Смежные вопросы