Чем отличается указатель от ссылки ?
От: Smart_Ass  
Дата: 28.12.05 13:01
Оценка:
Какие фундаментальные и не очень отличия есть между указателем и ссылкой ?
Re: Чем отличается указатель от ссылки ?
От: IROV..  
Дата: 28.12.05 13:12
Оценка:
Здравствуйте, Smart_Ass, Вы писали:

S_A>Какие фундаментальные и не очень отличия есть между указателем и ссылкой ?

Ссылка это константный указатель.
я не волшебник, я только учусь!
Re: Чем отличается указатель от ссылки ?
От: Кодт Россия  
Дата: 28.12.05 13:15
Оценка:
Здравствуйте, Smart_Ass, Вы писали:

S_A>Какие фундаментальные и не очень отличия есть между указателем и ссылкой ?


А поискать на сайте?
Перекуём баги на фичи!
Re[2]: Чем отличается указатель от ссылки ?
От: Smart_Ass  
Дата: 28.12.05 13:15
Оценка:
Здравствуйте, IROV.., Вы писали:

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


S_A>>Какие фундаментальные и не очень отличия есть между указателем и ссылкой ?

IRO>Ссылка это константный указатель.

Это не отличие, это как он реализован в С++.
Re: Чем отличается указатель от ссылки ?
От: Vamp Россия  
Дата: 28.12.05 13:34
Оценка: :))
S_A>Какие фундаментальные и не очень отличия есть между указателем и ссылкой ?
Мой любимый вопрос на собеседовании.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Чем отличается указатель от ссылки ?
От: Lorenzo_LAMAS  
Дата: 28.12.05 14:00
Оценка:
К>А поискать на сайте?
А еще лучше в доброй сотне книг по С++.
Of course, the code must be complete enough to compile and link.
Re: Чем отличается указатель от ссылки ?
От: IROV..  
Дата: 28.12.05 14:48
Оценка:
Здравствуйте, Smart_Ass, Вы писали:


#    include <stdio.h>

void main()
{
    int &a = *(int*)0;
    int *b = &a;

    printf("%d\n",b);
}


Очень интерестный результат
я не волшебник, я только учусь!
Re[2]: Чем отличается указатель от ссылки ?
От: IROV..  
Дата: 28.12.05 14:50
Оценка:
Здравствуйте, IROV.., Вы писали:

вместо 0 ставим.. 1,2,3,4,5,6,7,8
я не волшебник, я только учусь!
Re[3]: Чем отличается указатель от ссылки ?
От: sch  
Дата: 28.12.05 15:14
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

К>>А поискать на сайте?

L_L>А еще лучше в доброй сотне книг по С++.

Вредные советы даете, коллега.
Исключительно 8.3.2. Исключительно.
Re: Чем отличается указатель от ссылки ?
От: DEMON HOOD  
Дата: 28.12.05 15:36
Оценка:
S_A>Какие фундаментальные и не очень отличия есть между указателем и ссылкой ?
показал дурной пример
Автор: DEMON HOOD
Дата: 27.12.05
, каюсь
silent RSDN@Home 1.2.0 alpha [618] Windows XP 5.1.2600.65536
Re[3]: Чем отличается указатель от ссылки ?
От: Сергей Зизев Украина  
Дата: 29.12.05 07:44
Оценка:
Hello, IROV..!
You wrote on Wed, 28 Dec 2005 14:50:37 GMT:

I> Здравствуйте, IROV.., Вы писали:


I> вместо 0 ставим.. 1,2,3,4,5,6,7,8

И вместо void ставим int

With best regards, Sergey Zizyov. E-mail: ziserg@despammed.com
Posted via RSDN NNTP Server 1.9
Re[3]: Чем отличается указатель от ссылки ?
От: IROV..  
Дата: 29.12.05 10:17
Оценка: -3
Здравствуйте, Smart_Ass, Вы писали:

S_A>Здравствуйте, IROV.., Вы писали:


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


S_A>>>Какие фундаментальные и не очень отличия есть между указателем и ссылкой ?

IRO>>Ссылка это константный указатель.

S_A>Это не отличие, это как он реализован в С++.

А про какой язык ты вообще спрашываеш?

Ну смотрим..

есть

int const * ref_a = 0;


и

int a;
int & ref_a = a;


так вот некоторые говорят что сылка может сылаться только на обьект.. так вот я утверждаю что константный указатель тожа сылаеться на обьект..

в частности на обьект который находиться по адресу.. 0..
я с таким же успехом могу взять сылку с этого обьекта..
int &a = *(int*)0; — ведь по адресу 0 лежит какойто обьект..

а стереотип того что указатель на 0 это не валидный указатель.. это просто договореность.. с таким же успехом я могу считать.. указатель на 1 тожа невалидным..

так что раздницы между T const * и T & очень мало.. кроме как синтаксических нюансов.
я не волшебник, я только учусь!
Re: Чем отличается указатель от ссылки ?
От: pavel_turbin  
Дата: 29.12.05 10:18
Оценка: -3
Здравствуйте, Smart_Ass, Вы писали:

S_A>Какие фундаментальные и не очень отличия есть между указателем и ссылкой ?


ничем кроме referencing "->" vs "."
Re[4]: Чем отличается указатель от ссылки ?
От: Cyberax Марс  
Дата: 29.12.05 10:22
Оценка:
IROV.. wrote:
> в частности на обьект который находиться по адресу.. 0..
> я с таким же успехом могу взять сылку с этого обьекта..
> int &a = *(int*)0; — ведь по адресу 0 лежит какойто обьект..
Нет. Это Undefined Behaviour по Стандарту.

> а стереотип того что указатель на 0 это не валидный указатель.. это

> просто договореность.. с таким же успехом я могу считать.. указатель на
> 1 тожа невалидным..
Вообще-то, это не договоренность, а зафиксированое в Стандарте
требование. Кстати, "нулевой указатель" может и не быть численно равным
нолю.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re: Чем отличается указатель от ссылки ?
От: Лекс Россия  
Дата: 29.12.05 11:04
Оценка: 7 (1)
Здравствуйте, Smart_Ass, Вы писали:

S_A>Какие фундаментальные и не очень отличия есть между указателем и ссылкой ?


Б.Страуструп ("Язык прграммирования С++. Специальное издание", стор. 138):

... Несмотря на форму записи, ни один оператор не выполняет действий над ссылкой. Например:

void g()
{
    int ii = 0;
    int& rr = ii;
    rr++;              //ii увеличивается на 1
    int* pp = &rr;     //pp указывает на ii
}

Выражение rr++ допустимо, но не увеличивает ссылку rr; ++ примееняется к целому значению ii. Как следствие значение ссылки нельзя изменить после инициализации.

...

Очевидной реализацией ссылки является (константный) указатель, при каждом использовании которого происходит разыменование.

... ссылка, в отличие от указателя, не является объектом, над которым можно выполнять операции.
В некоторых случаях компилятор может оптимизировать ссылку таким образом, что во время исполнения вообще не будет существовать объекта, представляющего ссылку.
Инициализация ссылки тривиальна, когда инициализатором является lvalue (объект, адресс которого можно получить; см.$4.9.6). Инициализатором для "просто" T& должно быть lvalue типа T.
Инициализатор для const T& не обязан быть lvalue и даже иметь тип T. В таких случаях:
[1] если необходимо, осуществляется неявное преобразование к типу T;
[2] результирующее значение помещается во временную переменную типа T;
[3] временная переменная используется как значение инициализатора.
Рассмотрим пример:
   double& dr = 1;          // ошибка: требуется lvalue
   const double& cdr = 1;   // правильно


Можно проинтерпретировать последнюю инициализацию следующим образом:
   double temp = double(1);
   const double& cdr = temp;

Временная переменная, созданная для хранения инициализатора, существует до конца области видимости инициализируемой ею ссылки.
Ссылки на переменные и ссылки на константы различаются: создание временной переменной в случае ссылки на переменную интенсивно провоцирует ошибки.

...

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

...


С уважением,
Лекс.
C Уважением,
Андрей.
Re[4]: Чем отличается указатель от ссылки ?
От: Кодт Россия  
Дата: 29.12.05 11:06
Оценка: 6 (1)
Здравствуйте, IROV.., Вы писали:

S_A>>>>Какие фундаментальные и не очень отличия есть между указателем и ссылкой ?

IRO>>>Ссылка это константный указатель.

S_A>>Это не отличие, это как он реализован в С++.

IRO>А про какой язык ты вообще спрашываеш?

По ходу дела хочу развеять одну путаницу. Константный указатель и указатель на константу — разные вещи.

Имелось в виду
T x, y;

T* const p = &x;
T& r = y;

*p = 1;
r = 2;

p = &y; // ошибка компиляции

А никак не
T const *p = &x;
*p = 1; // ошибка компиляции
p = &y;


IRO>так вот некоторые говорят что сылка может сылаться только на обьект.. так вот я утверждаю что константный указатель тожа сылаеться на обьект..

IRO>в частности на обьект который находиться по адресу.. 0..
IRO>я с таким же успехом могу взять сылку с этого обьекта..
IRO>int &a = *(int*)0; — ведь по адресу 0 лежит какойто обьект..

Указатель можно инициализировать
— адресом валидного объекта
— адресом "за концом массива"
— нулевым указателем
— мусором (адресом разрушенного объекта)
(В трёх последних случаях запрещено разыменовывать; в двух последних — запрещена адресная арифметика).

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

IRO>а стереотип того что указатель на 0 это не валидный указатель.. это просто договореность.. с таким же успехом я могу считать.. указатель на 1 тожа невалидным..


Нет такого "указатель на 0". Есть специальное значение "нулевой указатель". Оно эквивалентно литеральному нулю и булевскому false.
Нулевой указатель, а также указатели за конец массива — валидные, но неразыменовываемые.

Указатель, полученный reinterpret_cast'ом или другим способом из мусора — невалидный.

IRO>так что раздницы между T const * и T & очень мало.. кроме как синтаксических нюансов.


Да, но этих синтаксических и семантических "нюансов" — очень много.
Перекуём баги на фичи!
Re[5]: Чем отличается указатель от ссылки ?
От: IROV..  
Дата: 29.12.05 11:07
Оценка: -1
Здравствуйте, Cyberax, Вы писали:

C>IROV.. wrote:

>> в частности на обьект который находиться по адресу.. 0..
>> я с таким же успехом могу взять сылку с этого обьекта..
>> int &a = *(int*)0; — ведь по адресу 0 лежит какойто обьект..
C>Нет. Это Undefined Behaviour по Стандарту.

int *j = 0;
int &i = *j;

а так? в чем незаконность?

>> а стереотип того что указатель на 0 это не валидный указатель.. это

>> просто договореность.. с таким же успехом я могу считать.. указатель на
>> 1 тожа невалидным..
C>Вообще-то, это не договоренность, а зафиксированое в Стандарте
C>требование.
А зафиксированое в Стандарте это не договореность?

C>Кстати, "нулевой указатель" может и не быть численно равным нолю.

Я об этом тожа написал
я не волшебник, я только учусь!
Re[5]: Чем отличается указатель от ссылки ?
От: IROV..  
Дата: 29.12.05 11:20
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, IROV.., Вы писали:


S_A>>>>>Какие фундаментальные и не очень отличия есть между указателем и ссылкой ?

IRO>>>>Ссылка это константный указатель.

S_A>>>Это не отличие, это как он реализован в С++.

IRO>>А про какой язык ты вообще спрашываеш?

К>По ходу дела хочу развеять одну путаницу. Константный указатель и указатель на константу — разные вещи.

Опечатался..

int j = 1;
int * const c_ptr_i = &j;
*c_ptr_i = 2;

int k = 1;
c_ptr_i = &k;



IRO>>так вот некоторые говорят что сылка может сылаться только на обьект.. так вот я утверждаю что константный указатель тожа сылаеться на обьект..

IRO>>в частности на обьект который находиться по адресу.. 0..
IRO>>я с таким же успехом могу взять сылку с этого обьекта..
IRO>>int &a = *(int*)0; — ведь по адресу 0 лежит какойто обьект..

К>Указатель можно инициализировать

К>- адресом валидного объекта
К>- адресом "за концом массива"
К>- нулевым указателем
К>- мусором (адресом разрушенного объекта)
К>(В трёх последних случаях запрещено разыменовывать; в двух последних — запрещена адресная арифметика).



К>Ссылку же можно инициализировать только (адресом) валидного объекта. В дальнейшем ссылка может инвалидироваться, но это совершенно другой разговор.

К>Все остальные случаи — это UB.
Можно узнать.. если я зделаю ссылку на обьект которого не существует.. и не буду с ним работать.. то это тожа UB?


IRO>>а стереотип того что указатель на 0 это не валидный указатель.. это просто договореность.. с таким же успехом я могу считать.. указатель на 1 тожа невалидным..


К>Нет такого "указатель на 0". Есть специальное значение "нулевой указатель". Оно эквивалентно литеральному нулю и булевскому false.

К>Нулевой указатель, а также указатели за конец массива — валидные, но неразыменовываемые.
А что означает валидный указатель?
или же "нулевой указатель" это некий терминатор.. но со своими правилами? и какая практичная польза от этого?

IRO>>так что раздницы между T const * и T & очень мало.. кроме как синтаксических нюансов.

К>Да, но этих синтаксических и семантических "нюансов" — очень много.
неспорю.
я не волшебник, я только учусь!
Re[2]: Чем отличается указатель от ссылки ?
От: Лекс Россия  
Дата: 29.12.05 11:24
Оценка: -1
Здравствуйте, pavel_turbin, Вы писали:

_>ничем кроме referencing "->" vs "."




class A
{
public:
   A(){}
   void func(){}
};

A a;
A *pa = &a;
A &ra = a;

ra.func();
(*pa).func();     // где твой "->" vs "."



Читай
Автор: Лекс
Дата: 29.12.05
C Уважением,
Андрей.
Re[6]: Чем отличается указатель от ссылки ?
От: Cyberax Марс  
Дата: 29.12.05 11:51
Оценка:
IROV.. wrote:
> int *j = 0;
> int &i = *j;
> а так? в чем незаконность?
В разыменовании нулевого указателя — это UB. Во многих случаях это
просто НЕ будет работать.

> C>Вообще-то, это не договоренность, а зафиксированое в Стандарте

> C>требование.
> А зафиксированое в Стандарте это не договореность?
Нет, это стандарт.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.