Указатели и ссылки (Прошу помочь разобраться в "чтении" этого добра) [C++]

Рейтинг: 0Ответов: 1Опубликовано: 10.04.2015

Помогите новичку разобраться) Для начала распишу как я "читаю" код в компиляторе. Допустим у меня есть:

int a=0;
int b=10;
a=b;

Заострю внимание на: "a=b" и прочитаю я это как: значению переменной "а" присвоить значение переменной "b". После чего значение "a" станет равно 10.

Вообщем. Возьмем к примеру ссылку.

int a = 5; 
int &b = a; //b - ссылка на а 
b = 10; //в а тоже стало 10

Как я понял с помощью амперсанда мы получаем настоящий адрес переменной, а не её буквенный синоним. int &b=a; Я прочитал бы как: адресу переменной b присвоить ЗНАЧЕНИЕ переменной a. То бишь вместо адреса к примеру 0x22ff08 у меня будет просто 5 (И по адресу 5 естественно никакого числа бы уже не было). Но это как я понимаю) А на деле то оказывается, что читать нужно как: адресу переменной b присвоить a , а именно саму БУКВУ "a", но не в коем случае не её содержание. Я правильно это понял? И никак не могу понять почему везде мы пишем одинаково, но к примеру когда я пишу b=a это значит что я приравниваю значение этих переменных, а когда int &b=a;, то тут уже адресу присваиваю именно букву. У меня просто начинает припекать уже почему все понимают, а я не понимаю. Пожалуйста помогите разобраться.

Ответы

▲ 2

Неразбериха возникла из-за того, что на знак амперсанда возложено несколько задач. Для того, чтобы понять разницу, рассмотрим, как подобный функционал может быть реализован с помощью языка Си:

int a = 10;
int* b = &a;
*b = 5;

Первая строка не претерпела изменений, поэтому, оставим ее без внимания.
Вторая строка изменилась следующим образом:

  1. Переменная b теперь имеет тип указатель на int. Обратите внимание на звездочку после названия типа. Стоит отметить, что в языке Си нет ссылок, есть только указатели. Фактически, в переменной b хранится адрес переменной типа int.
  2. Переменной b присваивается адрес переменной a. Обратите внимание, когда амперсанд стоит перед именем переменной, это означает, что мы берем ее адрес.

Третья строка также несколько преобразилась:

  1. Перед b появилась звездочка - это означает, что мы обращаемся к области памяти, по адресу, записанному в переменной b (разыменовываем указатель). Поскольку в переменной b хранится адрес переменной a, мы запишем в переменную a константу 5.

Теперь плавно перейдем на С++. Приведенный код будет справедлив для С++, но теперь в нашем распоряжении есть ссылки. Рассмотрим аналогичный код, но с использованием ссылок:

int a = 10;
int& b = a;
b = 5;

Первая строка не интересна.
Вторая строка изменилась следующим образом:

  1. Теперь тип переменной b - ссылка на int. Отличия между ссылкой и указателем следующие:

    1. Ссылка должна быть инициализирована при создании, после чего нельзя изменить адрес, на который она ссылается.
    2. При обращении к области памяти, на который указывает ссылка нет необходимости ее разыменовывать.
  2. При инициализации мы указываем, что ссылка b указывает на переменную a.

В третьей строке мы записываем по ссылке значение 5. Нам нет необходимости ее разыменовывать, это произойдет автоматически.