| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > В чем отличия указателя от ссылки? |
| Автор: Wowa 13.1.2005, 03:25 |
| В чем отличия указателя от ссылки? Добавлено @ 03:27 приведите, пожалуйста, пример указателя и ссылки. |
| Автор: chipset 13.1.2005, 03:29 |
| Через указатель к примеру передаются массивы.... Через передачу переменной по ссылке так сделать нельзя. |
| Автор: Guest 13.1.2005, 09:52 | ||||||
Ссылку можно назвать автоматически разименованным указателем..
Ссылки можно использовать например так
|
| Автор: azesmcar 13.1.2005, 09:54 | ||||
извиняюсь, здесь маленькая ошибка
Добавлено @ 09:58 Если убрать const в примере
можно будет изменять значение строки и в той функции которая вызывает function переданная переменная будет изменена в соответствии с изменениями в функции function... Тут еще кучу примеров можно привести... |
| Автор: bel_nikita 13.1.2005, 10:14 | ||||||||
Ссылка - это ссылка
Например:
Связав ссылку RL с переменной L, получаем возможность изменять значение переммой двумя способами:
Также через указатель:
|
| Автор: sergejzr 13.1.2005, 19:48 | ||||
| A теперь внимамие, правильный ответ: Грубо говоря это - одно и тоже. Ссылка - замаскированный указатель. Вот так мы работаем с указателем: Код А:
А что со сылками? Код В:
да тоже самое, эти два кода эквивалентны. (в комментарах из A замените указатель на ссылку) Компилер сделает из кода B код A. строка в строку. Так зачем эта неразбериха, которая из года в год путает студентов, спросите вы? Единственный ответ в красоте кода. Кто когда нибуть писал на Си с применение множества указателей, поймёт. Эти вечные (&n), *n=6, итд. Просто вырубают наповал. Если давать переменным короткие названия, то весь код будет из звездей и & состоять. Надеюсь, смог помочь разобраться |
| Автор: DENNN 13.1.2005, 19:56 | ||||
вот и нет К примеру если в функцию в качестве параметров передаются ссылки, то это дает дополнительную гарантию, что в при вызове этой функции будут переданны реальные значения, а не указатели "в никуда". Отсюда, в частности следует, что такой способ передачи параметров избавляет нас от проверки указателей на "валидность". Отсюда также следует, что при необходимости передачи в функцию массива неизвестной на этапе компиляции длины указатель может быть более удобен, чем использование ссылки. Добавлено @ 19:58
Ну это уж вообще абсолютно субъективное мнение. Я например предпочитаю смотреть в код и видеть, какие же операции выполнит процессор в каждой строчке. |
| Автор: sergejzr 13.1.2005, 20:04 | ||||||
а так?
Да я тоже |
| Автор: Fantasist 13.1.2005, 20:44 | ||||||||
А так ошибка компиляции. Ссылка должны быть инициализированна в месте ее объявления, за исключением того случая, когда ссылка является полем класса - в этом случае она должна быть инициализированна в списки инициализации конструктора. Ссылку невозможно изменить - все операции над ссылкой это операции над объектом на который она ссылается. Несмотря на это ссылка тем не менее может оказатся невалидной, если объект на который она ссылается будет удален. Один из типичных случаев:
С точки зрения синтаксиса все правильно, однако объект new_string будет удален при выходе из функции и ссылка будет возвращена невалидная. Хороший компилятор в этом месте выдает предупреждение, что возращается ссылка на стековый объект. Тем не менее, случай может оказатся более замаскированным, так что компилятор его не заметит:
Здесь компилятор не сомжет догадаться, что auto_ptr удалит объект указатель на который он содержит при выходе из функции и ссылка опять таки получится невалидной. Добавлено @ 20:48
В таком случае это должно быть явно указанно модификатором const для параметра функции. Язык С++ весьма гибок, чтобы большинство правил можно было бы выразить средствоми языка, а не на бумаге или в голове. |
| Автор: sergejzr 13.1.2005, 21:08 | ||||
Ага! Точно Но всмысле обьяснения отличия указателя от ссылки это всё равно
Ну да |
| Автор: Fantasist 13.1.2005, 21:26 | ||
Это не подстраховка а принцип понятия ссылки. Обрати внимание на выделенную мной фразу - если ты ссылку не инициализируешь сразу у тебя не будет возможности сделать это потом. |
| Автор: DENNN 14.1.2005, 10:48 | ||||||||
Я минуту улыбался
Как же это "все равно"?
Давайте все же проясним это туманное понятие "код становится читабельней". А то сейчас это философские рассуждения. Вот ты несколькими постами выше сказал:
А я например невижу ничего особенного как в опреаци доступа по указателю, так и в операции взятия адреса. Такая же операция, как к примеру + - % |
| Автор: Tripl-X 24.1.2005, 23:52 | ||
| '&' - получение адреса памяти, по которому находится переменная, а '*' - получение значения из адреса. Вот тебе пример:
Это выведет на экран два разных числа... Вобщем, если тебе нужно использовать значения переменной - используй *, а если адрес переменной - &. |
| Автор: PashaLost 29.10.2011, 15:29 |
| По-моему мнению, ветка не содержит ИСЧЕРПЫВАЮЩЕГО ответа на поставленный вопрос. И поэтому: УКАЗАТЕЛЬ - это АДРЕС переменной в чистом виде (00 12 FF 60) ССЫЛКА - это НЕИЗМЕННЫЙ скрытый указатель, являющийся ещё одним именем для переменной. В отличие от указателя, независимые ссылки ДОЛЖНЫ быть инициализированы. Type &ID_ссылки=ID_объекта; Ссылка должна быть явно инициализирована при её описании (если только она не является параметром функции (в этом случае инициализация произойдёт при замене формальных параметров фактическими) или не описана как extern - в этом случае она будет инициализирована в другом месте) В отличие от указателя, мы не можем изменять значение ссылки (значение скрытого адреса). В отличие от указателя, операции над ссылкой приводят к изменению величины, на которую она ссылается. (для указателя, операции над указателем изменяют значение его адреса, а не содержимого по адресу) Не существует указателей на ссылки (но существуют указатели на указатели), Не существует массивов ссылок (но существуют массивы указателей) Не существует ссылок на ссылки Функция не может быть перегружена, если описание её параметров отличается только наличием ссылки ( fun(int a), fun(int &a) ) Преимущества ссылок: Не нужно работать с адресом переменной, он подразумевается автоматически Со ссылками работаем как с переменной (а не как с адресом переменной) Копия объекта не передаётся в функцию (при передаче параметров функции), а только скрытый адрес. |
| Автор: borisbn 29.10.2011, 17:35 | ||
Сказал "А"... Недостатки ссылок:
Частая ошибка при использовании ссылок:
В последней строке refA не начинает ссылаться на objB, а objB копируется в objA, как-будто мы написали objA = objB; Я для себя установил одно простое правило: использовать указатели только в случае, когда использовать ссылки невозможно. Есть, правда, одно исключение - const char * - да и то, если в заголовочном файле ещё не включен <string> |
| Автор: mes 29.10.2011, 18:30 |
Сказал "Б"... ссылки в С++ не просто синтаксический сахар для всегда_инициализированного_указателя, но также могут создать поведение которое нельзя получить с помощью указателя.. (и это еще не вспоминая C++11) |
| Автор: math64 31.10.2011, 07:49 | ||
alexvs11, Невалидную ссылку можно получить проще, без таких ухищрений
|
| Автор: mes 31.10.2011, 09:13 |
| alexvs11, гарантия не на инвалидность (которая лежит в обоих случаях на плечах вызывающей стороны), а "не_нуль" гарантия.. Добавлено через 1 минуту и 47 секунд нуль значение для ссылки не валидно, в отличие от для указателя.. |
| Автор: borisbn 31.10.2011, 15:35 |
Не понял. Что Вы имели в виду ? |
| Автор: mes 31.10.2011, 19:06 |
продлевание жизни rvalue при пристыковании к константной ссылке со всеми вытекающими преимуществами и недостатками.. |
| Автор: borisbn 31.10.2011, 19:19 |
| mes, && ? Я имею ввиду: Вы имели в виду move semantics ? |
| Автор: mes 31.10.2011, 20:22 |
| нет.. говорил всего лишь о const& |
| Автор: volatile 31.10.2011, 23:45 | ||
Если сильно руки чешутся, можно и нулевую ссылку получить
http://liveworkspace.org/code/2f66addfa35846cc42b1b2d4719dbd3f |
| Автор: math64 1.11.2011, 07:48 | ||||
Это с ухищрениями. Можно получить ненамеренно:
|
| Автор: azesmcar 1.11.2011, 09:41 | ||
Нельзя, разыменование нулевого указателя - undefined behavior.
|
| Автор: alexvs11 1.11.2011, 09:46 |
| azesmcar, кто спорит тут вопрос в том, что с++ позволяет все свои правила обходить - в том числе и с нулевой ссылкой |
| Автор: mes 1.11.2011, 10:29 | ||
но не учитываете, что этот обход не нарушает гарантий языка |