Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели и ссылки 
:(
    Опции темы
drug007
Дата 15.9.2015, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Всем здравствуйте.
Не уверен, что не флуд, но задам вопрос. Наткнулся случайно на объявление о приеме на работу программиста С++ "для разработки критически важного компонента системы" с уверенным знанием С++ и контрольным вопросом - чем указатель отличается от ссылки. В коллективе возникло два мнения - 1) что это базовое требование для программиста С++ знать эти вещи и 2)что на самом деле в этом вопросе есть множество подводных камней и все не так просто, поэтому такой вопрос разработчику критически важного компонента уместен. Вот у меня вопрос - действительно ли есть эти самые подводные камни, что только опытные разработчики критически важных компонентов и владеют ими или все-таки это просто показывает уровень разработки в отдельно взятой организации?
PM MAIL   Вверх
xvr
Дата 15.9.2015, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(drug007 @  15.9.2015,  11:37 Найти цитируемый пост)
все-таки это просто показывает уровень разработки в отдельно взятой организации?

Именно это.

PM MAIL   Вверх
drug007
Дата 15.9.2015, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



xvr, спасибо! Ваше мнение значит для меня)) А то я уже начал думать, что упустил что-то важное.
PM MAIL   Вверх
jsharp36
Дата 16.9.2015, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2011

Репутация: нет
Всего: 1



А где контрольный вопрос? В описании вакансии? Это было бы странно.

А вообще может быть несколько вариантов.
1. Глупый текст вакансии могут составлять hr, ничего в этом не понимающие.
2. Если это первые тесты, то они делаются не для определения уровня знаний, а для отсеивания неадекватов. Хороших программистов мало, зато на вакансию откликнется немалое число странных людей. И вот чтобы только допустить до собеседования, желательно их как-то фильтровать.

Но вполне может быть и слабый уровень разработки, если все таки раньше неадекваты прорвали линию обороны и устроились там работать, а нормальных нет )

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
tzirechnoy
Дата 16.9.2015, 19:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Цитата
Вот у меня вопрос - действительно ли есть эти самые подводные камни


Конечно, есть! Как будто в C++ есть хоть какой-нибудь момент, в котором не было бы подводных камней.
PM MAIL   Вверх
drug007
Дата 18.9.2015, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Цитата(jsharp36 @  16.9.2015,  08:17 Найти цитируемый пост)
А где контрольный вопрос? В описании вакансии? Это было бы странно.

В том-то и дело, что прямо в вакансии. Как если бы это был критически важный момент.
Цитата(tzirechnoy @  16.9.2015,  19:58 Найти цитируемый пост)
Конечно, есть! Как будто в C++ есть хоть какой-нибудь момент, в котором не было бы подводных камней. 

Это я согласен. На 200%. Почему и спросил на форуме. Но в чем подводный камень заключается? При этом из вакансии складывается впечатление, что для того, чтобы избежать этих подводных камней достаточно знать чем ссылка отличается от указателя. Тут либо действительно вопрос с большой заковыркой, либо, простите, глупый вопрос. И если первое, то хотелось бы знать этот подвох.
PM MAIL   Вверх
feodorv
Дата 18.9.2015, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Есть тонкости. Хотя бы.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
_zorn_
Дата 18.9.2015, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1076
Регистрация: 21.8.2007

Репутация: 1
Всего: 12



Чему равно  smile 
i = i++ + ++i;

PM MAIL   Вверх
feodorv
Дата 18.9.2015, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



_zorn_, во-первых, не так, а так:
Код
i = i+++++i;
А во-вторых, здесь нет ссылок, нет указателей, нет их отличия друг от друга smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
_zorn_
Дата 19.9.2015, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1076
Регистрация: 21.8.2007

Репутация: 1
Всего: 12



Цитата(feodorv @  19.9.2015,  02:56 Найти цитируемый пост)
а так:

А зачем ? Все равно undefined behavior )
А ваш код даже не скомпилируется.

Цитата(feodorv @  19.9.2015,  02:56 Найти цитируемый пост)
А во-вторых, здесь нет ссылок, нет указателей

Это было больше к подводным камням и т.п. 

Это сообщение отредактировал(а) _zorn_ - 19.9.2015, 03:32
PM MAIL   Вверх
feodorv
Дата 19.9.2015, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(_zorn_ @  19.9.2015,  03:27 Найти цитируемый пост)
Это было больше к подводным камням и т.п. 
Нет уж, Вы давайте по теме - указатели и ссылки, а про "1000 и 1 способ прострелить себе ногу" и так известно.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
_zorn_
Дата 19.9.2015, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1076
Регистрация: 21.8.2007

Репутация: 1
Всего: 12



Цитата(feodorv @  19.9.2015,  13:29 Найти цитируемый пост)
 и так известно.

Но ведь вы дали не компилируемый код и не сказали в чем подвох в моём  smile 
Так что не надо тут  smile 

Ну если все так серьёзно - чем "ссылка" отличается от указателя в физическом плане ?
Неужели "ссылка" не ссылается на адрес памяти ? Или может быть указатель, если его назвать ссылкой примет другое значение ?

Зачем воду в ступе толочь ? Вот и хотел развлечь  smile 

ЗЫ. Это просто конструкции языка. Физически они ни чем не отличаются.

Это сообщение отредактировал(а) _zorn_ - 19.9.2015, 06:59
PM MAIL   Вверх
_zorn_
Дата 19.9.2015, 07:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1076
Регистрация: 21.8.2007

Репутация: 1
Всего: 12



Попытка "разобраться" в
Цитата(feodorv @  19.9.2015,  13:29 Найти цитируемый пост)
Нет уж, Вы давайте по теме - указатели и ссылки

как раз и ведет к
Цитата(feodorv @  19.9.2015,  13:29 Найти цитируемый пост)
"1000 и 1 способ прострелить себе ногу"

 smile 
PM MAIL   Вверх
feodorv
Дата 19.9.2015, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(_zorn_ @  19.9.2015,  06:41 Найти цитируемый пост)
Но ведь вы дали не компилируемый код и не сказали в чем подвох в моём

Я вот помню этот прикол со времен K&R компиляторов именно в таком виде, с пятью идущими подряд плюсиками без пробелов, выглядит устрашающе. Что я могу сказать, печально, что не компилируется. 


Цитата(_zorn_ @  19.9.2015,  06:41 Найти цитируемый пост)
Зачем воду в ступе толочь ?

Потому что тонкости всё же есть.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
_zorn_
Дата 19.9.2015, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1076
Регистрация: 21.8.2007

Репутация: 1
Всего: 12



Не надо мудрить.
Чем проще ваш код читается тем лучше. Не надо шифроваться от читателей (я раньше таким был smile). 
А работадатели сами не знают чего хотят часто. 
Где то тут на винграде была тема с неадекватной вакансией )
Там в тексте были даже такие технологии о которых я не слышал (или они умерли). Ну а знание http, nginx, apache меня всегда убивало )))
Они даже не вкурсе что httpd и apache это одно и тоже  smile

Добавлено @ 07:08
Цитата(feodorv @  19.9.2015,  14:05 Найти цитируемый пост)
Я вот помню

Зачем нам стариковские воспоминания ? )
Ты ведь так и не сказал, что с ним не так )))

Добавлено @ 07:11
Цитата(feodorv @  19.9.2015,  14:05 Найти цитируемый пост)
Потому что тонкости всё же есть. 

Тонкости ДЛЯ использования библиотек и т.п.
Чем он мне и не нравится. Скорей всего об этил ТОНКОСТЯХ разработчики БИБЛИОТЕК даже и не думали.
Вот такой вот он undefined behavior  smile 
Странно что вы не заметили в моем примере прямую отсылку...


ЗЫ. А изначально это выглядело так ++i + ++i Даже статья на лурке есть  smile 

Это сообщение отредактировал(а) _zorn_ - 19.9.2015, 07:17
PM MAIL   Вверх
feodorv
Дата 19.9.2015, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(_zorn_ @  19.9.2015,  07:05 Найти цитируемый пост)
Ты ведь так и не сказал, что с ним не так )))

Бог ты мой, мало кто не знаком с этим примером, и что он с собой несет; неважно как он при этом выглядит, хоть просто i = i++. Я же хотел вернуть Вас в русло темы, не более. Если уж Вы такой занудный, то давайте я начну.

  • Ссылка как тип введена в C++ (в С её нет). Ссылка и указатель - разные типы. Соответственно
    Код
    void func( int *ptr);
    и
    Код
    void func( int &ptr);
    разные функции.
  • Для указателя определена операция разыменования. Казалось бы мелочь в данном вопросе, а масса последствий. Например, для указателей можно спутать *ptr++ и (*ptr)++. С использованием ссылок можно писать такой код:
    Код
    func() = 0;
  • Указатель может указывать в любую область памяти процесса, его значение может быть изменено так, чтобы он указывал в другую область памяти. Ссылка всегда ссылается на одну и ту же область памяти, она обязана быть проинициализированной, к ней не может быть применена адресная арифметика.
  • Можно объявить указатель на указатель и т.д. Ссылки на ссылку не существует. Ссылка может указывать на указатель. Указатель не может указывать на ссылку.
  • В другой поток ссылку просто так не передашь. Указатель можно.
  • Константная ссылка может продлевать время жизни временного объекта, на который она указывает, константный указатель - нет.

И тут самое время задуматься над тонкостями rvalue/lvalue и &&. Но это уж Вы как-нибудь сами. Итого: хотя я и согласен с точкой зрения xvr, но когда я всё это описывал, моя уверенность в её справедливость сильно пошатнулась)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
feodorv
Дата 19.9.2015, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Ещё. Никогда над этим не задумывался)))
  • Можно иметь массив указателей, массив ссылок - нет.
  • Размер (sizeof) указателя на массив естественно совпадает с размером указателя в системе, а размер ссылки на массив выдаёт честный размер массива.


Это сообщение отредактировал(а) feodorv - 21.9.2015, 09:35


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
drug007
Дата 21.9.2015, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Цитата(feodorv @  18.9.2015,  12:02 Найти цитируемый пост)
Есть тонкости. Хотя бы. 

Ну я бы отнес это к нюансам выведения типов в шаблонах. Почему-то думается, что вряд ли имелось что-то вроде этого при вопросе "чем указатель отличается от ссылки". Но пример хороший.
PM MAIL   Вверх
baldina
Дата 21.9.2015, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



_zorn_, в вашем примере не только нет ссылок, но и вообще может быть что угодно в зависимости от типа i.

а то, что код не компилируется - понятно, лексический анализатор жаден, и код интерпретируется как i++ ++ +i, а постфиксные выражения группируются слева направо, так что для скалярных типов будет попытка изменить rvalue

основной "тонкостью" в ссылках vs указателях думаю стоит считать разницу в смысле выражений:
Код

type *p1=&x;
type *p2=&y;

type& r1=x;
type& r2=y;

p1 = p2; // указатель p1 изменился и указывает на y. 
r1 = r2;  // ссылка r1 не изменилась (по-прежнему ссылается на x), изменился x (стал равным y)

что является следствием главной особенности ссылки: она связывается со ссылаемым объектом единожды в момент инициализации.

Добавлено через 5 минут и 27 секунд
имхо удобно говорить о ссылках как об алиасах (альтернативных именах) уже объявленных переменных, тогда становится понятно и как работает, и искушения сравнивать с указателями не возникает. в этом русле и понимание rvalue reference мне кажется проще.
PM MAIL   Вверх
xvr
Дата 21.9.2015, 15:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(feodorv @  19.9.2015,  08:12 Найти цитируемый пост)
Итого: хотя я и согласен с точкой зрения xvr, но когда я всё это описывал, моя уверенность в её справедливость сильно пошатнулась))) 

Давайте переформулируем: указатель от ссылки отличается всем - это разные сущности языка С++. Можно с тем же успехом спрашивать чем отличается указатель и указатель на член класса (pointer & member pointer).
И то, что компилятор использует указатель для физической реализации ссылки дела не меняет.
Так что вопрос об отличии указателя и ссылки попросту некорректен  smile 

PM MAIL   Вверх
drug007
Дата 22.9.2015, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Цитата(xvr @  21.9.2015,  15:50 Найти цитируемый пост)
Так что вопрос об отличии указателя и ссылки попросту некорректен

И я такого же мнения. Если бы вопрос был о том, где лучше применять указатели, а где ссылки и почему - это уже совсем другой расклад.

@feodorv, а не проясните про этот код?
Код

func() = 0;

Функция возвращает ссылку и мы этой ссылке присваиваем значение?

Это сообщение отредактировал(а) drug007 - 22.9.2015, 10:16
PM MAIL   Вверх
volatile
Дата 22.9.2015, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(drug007 @  22.9.2015,  10:11 Найти цитируемый пост)
Функция возвращает ссылку и мы этой ссылке присваиваем значение?

не ссылке (ссылке вообще нельзя присвоить значение, ее можно только инициализировать), а переменной на которую ссылается эта ссылка

Код

int a = 0;

int & func () {return a;}

int main ()
{
   printf ("a=%d\n", a);
   func () = 42;
   printf ("a=%d\n", a);
}


Добавлено через 3 минуты и 48 секунд
http://codepad.org/D2bBVPu2
PM MAIL   Вверх
drug007
Дата 22.9.2015, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Цитата(volatile @  22.9.2015,  12:21 Найти цитируемый пост)
не ссылке (ссылке вообще нельзя присвоить значение, ее можно только инициализировать), а переменной на которую ссылается эта ссылка

Я это и имел в виду. В принципе все просто, просто непривычная запись. В свое время сбил с толку default в switch'е вида:
Код

switch(foo)
{
    default:
    case 1:
    ....
}

Настолько привык, что default всегда последний. Привычки они не всегда полезные)
PM MAIL   Вверх
konshyn
Дата 23.10.2015, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(drug007 @  22.9.2015,  10:11 Найти цитируемый пост)
Цитата

Так что вопрос об отличии указателя и ссылки попросту некорректен

И я такого же мнения. Если бы вопрос был о том, где лучше применять указатели, а где ссылки и почему - это уже совсем другой расклад.


по-моему, вопрос более чем корректен. Ссылку на указатель можно создать, а вот указатель на ссылку - нет. 
Но что касается основного вопроса:
Цитата(drug007 @  15.9.2015,  11:37 Найти цитируемый пост)
Вот у меня вопрос - действительно ли есть эти самые подводные камни, что только опытные разработчики критически важных компонентов и владеют ими или все-таки это просто показывает уровень разработки в отдельно взятой организации? 

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

Добавлено @ 14:07
Код

#include <iostream>

int main() {
    int a = 11;
    int &b = a;
    int *p = b; //  Указатель на ссылку не работат. error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive]
    int *p = &b; // а так все хорошо
    int *&c = p; // Делаем ссылку на указатель
    std::cout << b << " " << *c << std::endl;
    return 0;
}


Главное не путать ссылки и операцию взятия адреса. Хоть для этого и требуется один и тот же символ - амперсант. &

Это сообщение отредактировал(а) konshyn - 26.10.2015, 11:24


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.