В чём разница ссылки от указателя?
От: alex_ant  
Дата: 05.05.06 07:07
Оценка: :)
Недавно один товарищ на мой вопрос по языку С++ заметил «У… батенька мы даже не знаем разницы между ссылкой и указателем! Темнота!..» Для меня, честно говоря, это оказалось откровением. В литературе я не встречал чёткого разграничения этих понятий и воспринимал их как синонимы. Поиски ничего не дали. Так в чём же разница?
Re: В чём разница ссылки от указателя?
От: jazzer Россия Skype: enerjazzer
Дата: 05.05.06 07:11
Оценка: :)
Здравствуйте, alex_ant, Вы писали:

_>Недавно один товарищ на мой вопрос по языку С++ заметил «У… батенька мы даже не знаем разницы между ссылкой и указателем! Темнота!..» Для меня, честно говоря, это оказалось откровением. В литературе я не встречал чёткого разграничения этих понятий и воспринимал их как синонимы. Поиски ничего не дали. Так в чём же разница?


int& — ссылка на int
int* — указатель на int

читай Страуструпа, в общем
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: В чём разница ссылки от указателя?
От: memorilik  
Дата: 05.05.06 07:23
Оценка: +1 -5 :))
Здравствуйте, alex_ant, Вы писали:

_>Недавно один товарищ на мой вопрос по языку С++ заметил «У… батенька мы даже не знаем разницы между ссылкой и указателем! Темнота!..» Для меня, честно говоря, это оказалось откровением. В литературе я не встречал чёткого разграничения этих понятий и воспринимал их как синонимы. Поиски ничего не дали. Так в чём же разница?


Разница в том, что ссылка — это второе имя переменной. И на этапе компиляции компилятор заменяет ссылку нужным именем. Вот и все.
Re: В чём разница ссылки от указателя?
От: Bell Россия  
Дата: 05.05.06 07:25
Оценка:
Здравствуйте, alex_ant, Вы писали:

_>Поиски ничего не дали.

Плохо искал?
Например здесь
Автор: DemAS
Дата: 28.10.02
Любите книгу — источник знаний (с) М.Горький
Re: В чём разница ссылки от указателя?
От: LuciferMoscow Россия  
Дата: 05.05.06 07:26
Оценка: +2
Здравствуйте, alex_ant, Вы писали:

_>Недавно один товарищ на мой вопрос по языку С++ заметил «У… батенька мы даже не знаем разницы между ссылкой и указателем! Темнота!..» Для меня, честно говоря, это оказалось откровением. В литературе я не встречал чёткого разграничения этих понятий и воспринимал их как синонимы. Поиски ничего не дали. Так в чём же разница?

1. Ссылка уже разименована.
2. Ссылка не мжет быть NULL
3. Указатель можно инициализировать много раз, ссылку — ровно один.
Re[2]: В чём разница ссылки от указателя?
От: LuciferMoscow Россия  
Дата: 05.05.06 07:29
Оценка:
Здравствуйте, memorilik, Вы писали:
<skipped>
M>Разница в том, что ссылка — это второе имя переменной. И на этапе компиляции компилятор заменяет ссылку нужным именем. Вот и все.


И чем тут будет заменена ссылка на этапе компиляции?
// 1
void Foo( int& result )
{
///.....
}

// 2
void Foo( int* p )
{
 if (!p )return;

 int& ref=*p;
//.....
}
Re[2]: В чём разница ссылки от указателя?
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 05.05.06 07:33
Оценка: :))
Здравствуйте, LuciferMoscow, Вы писали:

LM>2. Ссылка не мжет быть NULL

LM>3. Указатель можно инициализировать много раз, ссылку — ровно один.

Я как-то раз наткнулся на такую конструкцию в ATL(?). Что-то типа

union
{
 long* px;
 long& rx;
 //....
};

Явно написана грязными извращенцами
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: В чём разница ссылки от указателя?
От: Аноним  
Дата: 05.05.06 07:36
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Здравствуйте, alex_ant, Вы писали:


_>>Недавно один товарищ на мой вопрос по языку С++ заметил «У… батенька мы даже не знаем разницы между ссылкой и указателем! Темнота!..» Для меня, честно говоря, это оказалось откровением. В литературе я не встречал чёткого разграничения этих понятий и воспринимал их как синонимы. Поиски ничего не дали. Так в чём же разница?

LM>1. Ссылка уже разименована.
LM>2. Ссылка не мжет быть NULL
LM>3. Указатель можно инициализировать много раз, ссылку — ровно один.

Добавлю:
4. Указатель — это lvalue, тоесть указатель сам имеет адрес, а ссылка адреса не имеет.
Re[3]: В чём разница ссылки от указателя?
От: LuciferMoscow Россия  
Дата: 05.05.06 07:39
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Я как-то раз наткнулся на такую конструкцию в ATL(?). Что-то типа
КД>
КД>union
КД>{
КД> long* px;
КД> long& rx;
КД> //....
КД>};
КД>

КД>Явно написана грязными извращенцами
Это проблемы грязных извращенцев.
Подобного
class A
{
public:
 // Функция НЕ виртуальная
 void Foo();
};

A* p=0;
p->Foo();

кода в MFC хватает. Но этоже не повод так делать...
Re[2]: В чём разница ссылки от указателя?
От: pullover  
Дата: 05.05.06 07:41
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>2. Ссылка не мжет быть NULL




    int val = 10;
    int *p = &val;
    // жил был указатель, тут его обнуляем...
    p = NULL;
    // а здесь получаем ссылку. увы ссылка нулевая и проверить уже никак не можем.
    int &ref = *p;
    
    ref++;
Re[3]: В чём разница ссылки от указателя?
От: Bell Россия  
Дата: 05.05.06 07:46
Оценка:
Здравствуйте, pullover, Вы писали:

P>

P>    int val = 10;
P>    int *p = &val;
P>    // жил был указатель, тут его обнуляем...
P>    p = NULL;
P>    // а здесь получаем ссылку. увы ссылка нулевая и проверить уже никак не можем.
P>    int &ref = *p;
    
P>    ref++;
P>


А здесь мы получаем не ссылку, а UB из-за разыменовывания нулевого указателя.
Любите книгу — источник знаний (с) М.Горький
Re: В чём разница ссылки от указателя?
От: alex_ant  
Дата: 05.05.06 07:50
Оценка:
Всем огромное спасибо! Воистину век живи, век учись...
Re[3]: В чём разница ссылки от указателя?
От: LuciferMoscow Россия  
Дата: 05.05.06 07:54
Оценка: 1 (1)
Здравствуйте, pullover, Вы писали:
LM>>2. Ссылка не мжет быть NULL
P>

P>    int val = 10;
P>    int *p = &val;
P>    // жил был указатель, тут его обнуляем...
P>    p = NULL;
P>    // а здесь получаем ссылку. увы ссылка нулевая и проверить уже никак не можем.
P>    int &ref = *p;// ВОТ ТУТ МЫ ПОЛУЧАЕМ НЕОПРЕДЕЛЕННОЕ ПОВЕДЕНИЕ     
P>    ref++;// А этот код вполне корректен
P>

Можно ли сунуть пальцы в розетку? Можно! Но зачем?!

Когда я говорю "не может быть NULL" я имею ввиду следующее:
class A;

void Foo(A& ref)
{
  ref.CallSomeFoo();// Код полностью корректен
};

void Foo(A* ptr)
{
  ptr->CallSomeFoo();// Код не корректен. Получаем интересное поведение при передаче нулевого указателя и по ушам от начальства :maniac: 
}
Re[2]: В чём разница ссылки от указателя?
От: Вумудщзук Беларусь  
Дата: 05.05.06 08:35
Оценка:
>Всем огромное спасибо! Воистину век живи, век учись...
только я бы сказал, что форум — не место для изучения азов: разница между ссылкой и указателем описана в любой книжке по с++
Homo sum et nihil humani a me alienum puto...
Re[3]: В чём разница ссылки от указателя?
От: memorilik  
Дата: 05.05.06 09:12
Оценка: -1
Здравствуйте, LuciferMoscow, Вы писали:

Вот что написано у Страуструпа (http://cclib.nsu.ru/projects/gnudocs/texts/cpptut.html)

2.3.10
Ссылка является другим именем объекта... Очевидным способом реализации ссылки является константный
указатель...

2.4.6
...компилятор может несколькими путями
воспользоваться тем, что объект является константой (конечно, в
зависимости от того, насколько он сообразителен). Самое очевидное —
это то, что для константы не требуется выделять память, поскольку
компилятор знает ее значение.

Или я что-то не так понимаю ?
Re[3]: В чём разница ссылки от указателя?
От: achp  
Дата: 05.05.06 09:23
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>
КД>union
КД>{
КД> long* px;
КД> long& rx;
КД> //....
КД>};
КД>


В Си++ компилироваться не должно.
... << RSDN@Home 1.1.3 stable >>
Re[3]: В чём разница ссылки от указателя?
От: FreshMeat Россия http://www.rsdn.org
Дата: 05.05.06 09:31
Оценка: 1 (1)
Здравствуйте, Вумудщзук, Вы писали:

В>только я бы сказал, что форум — не место для изучения азов: разница между ссылкой и указателем описана в любой книжке по с++

Страуструп в "ЯП C++, Спец издание" дает описание ссылки на странице 137. А спустя 300 страничек показывает еще одно отличие (разное поведение при dynamic_cast), которое сам называет фундаментальным.
Такой разброс хоть и вызывает недоумение, но является логичным для учебника. Вот и получается, что иногда, кроме как на сильном форуме, увидеть полный список отличий негде.
Хорошо там, где мы есть! :)
Re[4]: В чём разница ссылки от указателя?
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 05.05.06 09:35
Оценка: :))) :)))
Здравствуйте, achp, Вы писали:

КД>>
КД>>union
КД>>{
КД>> long* px;
КД>> long& rx;
КД>> //....
КД>>};
КД>>


A>В Си++ компилироваться не должно.


- Врешь, однако. Роботы класса "Буратино" нырять не могут.
- Не могут. Но ныряют.

(с) Гоблин
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: В чём разница ссылки от указателя?
От: rg45 СССР  
Дата: 05.05.06 09:41
Оценка: +1
"alex_ant" <52470@users.rsdn.ru> wrote in message news:1883420@news.rsdn.ru...
> Недавно один товарищ на мой вопрос по языку С++ заметил «У… батенька мы даже не знаем разницы между ссылкой и указателем! Темнота!..» Для меня, честно говоря, это оказалось откровением. В литературе я не встречал чёткого разграничения этих понятий и воспринимал их как синонимы. Поиски ничего не дали. Так в чём же разница?

По своему внутреннему представлению указатель и ссылка действительно одинаковы.
А вот с точки зрения использования, разница состоит в следующем:
1. Указатель можно перенаправить на другой объект, ссылка же инициализируется только один раз при создании и не может быть перенаправлена.
2. Для доступа к данным через указатель используются операторы * и ->. Так же к указателю применим оператор индексирования []. Доступ к данным по ссылке по форме выглядит так, как будто работа идет непосредственно с самой переменной, если это структура или класс, то доступ к членам осуществляется через оператор "точка".
3. Результатом взятия адреса указателя является адрес ячейки памяти, в которой хранится сам указатель. Адресом ссылки же будет адрес объекта, адресуемого ссылкой.
4. Ссылка может обеспечвать время жизни временной переменной: пока жива ссылка, будет жива и временная переменная.

Если говорить коротко, то ссылку можно считать указателем, который всегда разыменован автоматически.
Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
Re: В чём разница ссылки от указателя?
От: Maxim_Popov Россия  
Дата: 05.05.06 17:29
Оценка:
Здравствуйте, alex_ant, Вы писали:

_>Недавно один товарищ на мой вопрос по языку С++ заметил «У… батенька мы даже не знаем разницы между ссылкой и указателем! Темнота!..» Для меня, честно говоря, это оказалось откровением. В литературе я не встречал чёткого разграничения этих понятий и воспринимал их как синонимы. Поиски ничего не дали. Так в чём же разница?


в C++ и указатели и ссылки косвенно ссылаются на обьект.
Два различия:
1. ссылка всегда обязана ссылаться на обьект, тогда как указатель может быть равен нулю.
2. после инициализации ссылки нельзя изменить то, куда она ссылается, а для указателей это возможно.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.