crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> Использование ссылок или указателей или вообще без них, плюсы и минусы их использования
Litkevich Yuriy
  опции профиля:
сообщение 17.3.2008, 22:11
Сообщение #11


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


как я понимаю x'у
я имел ввиду следующий код:
int n = 1;
int &rn;

неинициализированная ссылка
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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  


Цитата(0xF @ 18.3.2008, 2:28) *
Во-вторых, как это "псевдоним"? Внутри это такой же адрес... Выходит, что ссылка - такой же указатель, который не может указывать в никуда, а только на нужную область памяти(там где переменная хранится) + немного другой синтаксис(не надо разыменовывать, чтоб сделать выборку значения, как при работе с указателями)

Ссылка может быть, а может и не быть странслирована в указатель.
Например, если ссылка находится в локальной зоне видимости, нормальный компилятор просто не будет заводить для неё отдельную ячейку памяти (см. например, приведённый тобой код). :rolleyes:
То же самое с подставляемыми (inline) функциями.
Для временных объектов ссылка может вполне не быть указателем, а именно обозначать сам объект:
struct base_t {};
struct derived_t : base_t {};

int main() {
  const base_t& obj = derived_t();
}

В этом случае, obj может трактоваться компилятором так же, как если бы было объявлено const derived_t obj.
Смысла нет заводить здесь ещё и указатель. :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 18.3.2008, 8:49
Сообщение #18


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Собственно, кардинальное различие в том, что указатель всегда имеет "свою" память и язык позволяет получить на неё указатель.
А ссылка не обязана иметь свою память, и средствами языка ты не можешь узнать имеет или нет. :)

Какие-то манипуляции со ссылкой в языке всегда эквивалентны операциям над объектом которым она инициализирована.
И в языке нет прямого способа манипулировать чем-то, что-бы было ссылкой. :)

Сообщение отредактировал Tonal - 18.3.2008, 8:54
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 4:31