Использование ссылок или указателей или вообще без них, плюсы и минусы их использования |
Здравствуйте, гость ( Вход | Регистрация )
Использование ссылок или указателей или вообще без них, плюсы и минусы их использования |
Litkevich Yuriy |
17.3.2008, 22:11
Сообщение
#11
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
как я понимаю x'у
я имел ввиду следующий код:
неинициализированная ссылка |
|
|
Admin |
17.3.2008, 22:13
Сообщение
#12
|
Администратор Группа: Администратор Сообщений: 646 Регистрация: 9.10.2007 Из: crossplatform.ru Пользователь №: 1 Спасибо сказали: 17 раз(а) Репутация: 2 |
Так не может быть, а так как я показал может быть, но вроде как инициализированная, а вроде как нет.
|
|
|
Litkevich Yuriy |
17.3.2008, 22:28
Сообщение
#13
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
в твоем примере она всегда инициализирована, нет момента когда она показывает в никуда
мало того n тоже равна 100, а точнее именно n, а не rn, это лишь псевдоним n |
|
|
0xF |
17.3.2008, 23:28
Сообщение
#14
|
Студент Группа: Участник Сообщений: 71 Регистрация: 12.11.2007 Пользователь №: 20 Спасибо сказали: 0 раз(а) Репутация: 0 |
Цитата(Litkevich Yuriy) если я правильнопонимаю Си, то ссылка и указатель разные вещи: указатель - переменная содержащая адрес, может указыват в никуда; ссылка - псевдоним конкретной переменной, неможет указыват в никуда, т.е. всегда инициализируется конкретным значением; Во-первых, в С нету ссылок, они появились только в С++ Во-вторых, как это "псевдоним"? Внутри это такой же адрес... Выходит, что ссылка - такой же указатель, который не может указывать в никуда, а только на нужную область памяти(там где переменная хранится) + немного другой синтаксис(не надо разыменовывать, чтоб сделать выборку значения, как при работе с указателями) Ну и плюс ко всему, ссылка обязательно должна быть инициализирована, так что твой код(int n = 1; int &rn;) даже не соберется Цитата(Admin) int n = 1; int &rn = n; if( true) { int x = 100; rn=x; } // Чему равна rn? rn по-прежнему ссылается на n, а n тепер равна 100 Сообщение отредактировал 0xF - 17.3.2008, 23:31 |
|
|
Litkevich Yuriy |
17.3.2008, 23:33
Сообщение
#15
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Цитата даже не соберется я его для того и привел, что ее инициализировать ее обязательно, а ссылка, может по праву считатся псевдонимом, если говорить я зыком литературным т.к. в указаном примере n будет равна 100, а rn ее псевдоним |
|
|
Novak |
17.3.2008, 23:40
Сообщение
#16
|
Активный участник Группа: Участник Сообщений: 319 Регистрация: 15.3.2008 Из: Замкадыш Пользователь №: 121 Спасибо сказали: 28 раз(а) Репутация: 6 |
Имхо, может по сути ссылки и указатели близки. Но вещи всеже разные, главное отличие в предназначении. Ссылки, как было сказано выше - псевдонимы переменных. Указатели же используются несколько шире, чем просто псевдонимы.
Не возьмусь судить о реализации в компиляторах, но вещи эти именно семантически, с точки зрения языка различны. |
|
|
Tonal |
18.3.2008, 8:45
Сообщение
#17
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Во-вторых, как это "псевдоним"? Внутри это такой же адрес... Выходит, что ссылка - такой же указатель, который не может указывать в никуда, а только на нужную область памяти(там где переменная хранится) + немного другой синтаксис(не надо разыменовывать, чтоб сделать выборку значения, как при работе с указателями) Ссылка может быть, а может и не быть странслирована в указатель. Например, если ссылка находится в локальной зоне видимости, нормальный компилятор просто не будет заводить для неё отдельную ячейку памяти (см. например, приведённый тобой код). То же самое с подставляемыми (inline) функциями. Для временных объектов ссылка может вполне не быть указателем, а именно обозначать сам объект:
В этом случае, obj может трактоваться компилятором так же, как если бы было объявлено const derived_t obj. Смысла нет заводить здесь ещё и указатель. |
|
|
Tonal |
18.3.2008, 8:49
Сообщение
#18
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Собственно, кардинальное различие в том, что указатель всегда имеет "свою" память и язык позволяет получить на неё указатель.
А ссылка не обязана иметь свою память, и средствами языка ты не можешь узнать имеет или нет. Какие-то манипуляции со ссылкой в языке всегда эквивалентны операциям над объектом которым она инициализирована. И в языке нет прямого способа манипулировать чем-то, что-бы было ссылкой. Сообщение отредактировал Tonal - 18.3.2008, 8:54 |
|
|
Текстовая версия | Сейчас: 3.1.2025, 1:38 |