![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
В чем отличия указателя от ссылки?
Добавлено @ 03:27 приведите, пожалуйста, пример указателя и ссылки. |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Через указатель к примеру передаются массивы.... Через передачу переменной по ссылке так сделать нельзя.
--------------------
|
|||
|
||||
| Guest |
|
||||||
|
Unregistered |
Ссылку можно назвать автоматически разименованным указателем..
Ссылки можно использовать например так
|
||||||
|
|||||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
извиняюсь, здесь маленькая ошибка
Добавлено @ 09:58 Если убрать const в примере
можно будет изменять значение строки и в той функции которая вызывает function переданная переменная будет изменена в соответствии с изменениями в функции function... Тут еще кучу примеров можно привести... |
||||
|
|||||
| bel_nikita |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Ссылка - это ссылка
Например:
Связав ссылку RL с переменной L, получаем возможность изменять значение переммой двумя способами:
Также через указатель:
|
||||||||
|
|||||||||
| sergejzr |
|
||||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
A теперь внимамие, правильный ответ:
Грубо говоря это - одно и тоже. Ссылка - замаскированный указатель. Вот так мы работаем с указателем: Код А:
А что со сылками? Код В:
да тоже самое, эти два кода эквивалентны. (в комментарах из A замените указатель на ссылку) Компилер сделает из кода B код A. строка в строку. Так зачем эта неразбериха, которая из года в год путает студентов, спросите вы? Единственный ответ в красоте кода. Кто когда нибуть писал на Си с применение множества указателей, поймёт. Эти вечные (&n), *n=6, итд. Просто вырубают наповал. Если давать переменным короткие названия, то весь код будет из звездей и & состоять. Надеюсь, смог помочь разобраться |
||||
|
|||||
| DENNN |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
вот и нет К примеру если в функцию в качестве параметров передаются ссылки, то это дает дополнительную гарантию, что в при вызове этой функции будут переданны реальные значения, а не указатели "в никуда". Отсюда, в частности следует, что такой способ передачи параметров избавляет нас от проверки указателей на "валидность". Отсюда также следует, что при необходимости передачи в функцию массива неизвестной на этапе компиляции длины указатель может быть более удобен, чем использование ссылки. Добавлено @ 19:58
Ну это уж вообще абсолютно субъективное мнение. Я например предпочитаю смотреть в код и видеть, какие же операции выполнит процессор в каждой строчке. |
||||
|
|||||
| sergejzr |
|
||||||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
а так?
Да я тоже |
||||||
|
|||||||
| Fantasist |
|
||||||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
А так ошибка компиляции. Ссылка должны быть инициализированна в месте ее объявления, за исключением того случая, когда ссылка является полем класса - в этом случае она должна быть инициализированна в списки инициализации конструктора. Ссылку невозможно изменить - все операции над ссылкой это операции над объектом на который она ссылается. Несмотря на это ссылка тем не менее может оказатся невалидной, если объект на который она ссылается будет удален. Один из типичных случаев:
С точки зрения синтаксиса все правильно, однако объект new_string будет удален при выходе из функции и ссылка будет возвращена невалидная. Хороший компилятор в этом месте выдает предупреждение, что возращается ссылка на стековый объект. Тем не менее, случай может оказатся более замаскированным, так что компилятор его не заметит:
Здесь компилятор не сомжет догадаться, что auto_ptr удалит объект указатель на который он содержит при выходе из функции и ссылка опять таки получится невалидной. Добавлено @ 20:48
В таком случае это должно быть явно указанно модификатором const для параметра функции. Язык С++ весьма гибок, чтобы большинство правил можно было бы выразить средствоми языка, а не на бумаге или в голове. Это сообщение отредактировал(а) Fantasist - 13.1.2005, 21:23 -------------------- Волны гасят ветер... |
||||||||
|
|||||||||
| sergejzr |
|
||||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Ага! Точно Но всмысле обьяснения отличия указателя от ссылки это всё равно
Ну да |
||||
|
|||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Это не подстраховка а принцип понятия ссылки. Обрати внимание на выделенную мной фразу - если ты ссылку не инициализируешь сразу у тебя не будет возможности сделать это потом. -------------------- Волны гасят ветер... |
|||
|
||||
| DENNN |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Я минуту улыбался
Как же это "все равно"?
Давайте все же проясним это туманное понятие "код становится читабельней". А то сейчас это философские рассуждения. Вот ты несколькими постами выше сказал:
А я например невижу ничего особенного как в опреаци доступа по указателю, так и в операции взятия адреса. Такая же операция, как к примеру + - % |
||||||||
|
|||||||||
| Tripl-X |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 29.12.2004 Репутация: 1 Всего: 1 |
'&' - получение адреса памяти, по которому находится переменная, а '*' - получение значения из адреса.
Вот тебе пример:
Это выведет на экран два разных числа... Вобщем, если тебе нужно использовать значения переменной - используй *, а если адрес переменной - &. |
|||
|
||||
| PashaLost |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 18.1.2008 Репутация: нет Всего: нет |
По-моему мнению, ветка не содержит ИСЧЕРПЫВАЮЩЕГО ответа на поставленный вопрос. И поэтому:
УКАЗАТЕЛЬ - это АДРЕС переменной в чистом виде (00 12 FF 60) ССЫЛКА - это НЕИЗМЕННЫЙ скрытый указатель, являющийся ещё одним именем для переменной. В отличие от указателя, независимые ссылки ДОЛЖНЫ быть инициализированы. Type &ID_ссылки=ID_объекта; Ссылка должна быть явно инициализирована при её описании (если только она не является параметром функции (в этом случае инициализация произойдёт при замене формальных параметров фактическими) или не описана как extern - в этом случае она будет инициализирована в другом месте) В отличие от указателя, мы не можем изменять значение ссылки (значение скрытого адреса). В отличие от указателя, операции над ссылкой приводят к изменению величины, на которую она ссылается. (для указателя, операции над указателем изменяют значение его адреса, а не содержимого по адресу) Не существует указателей на ссылки (но существуют указатели на указатели), Не существует массивов ссылок (но существуют массивы указателей) Не существует ссылок на ссылки Функция не может быть перегружена, если описание её параметров отличается только наличием ссылки ( fun(int a), fun(int &a) ) Преимущества ссылок: Не нужно работать с адресом переменной, он подразумевается автоматически Со ссылками работаем как с переменной (а не как с адресом переменной) Копия объекта не передаётся в функцию (при передаче параметров функции), а только скрытый адрес. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Сказал "А"... Недостатки ссылок:
Частая ошибка при использовании ссылок:
В последней строке refA не начинает ссылаться на objB, а objB копируется в objA, как-будто мы написали objA = objB; Я для себя установил одно простое правило: использовать указатели только в случае, когда использовать ссылки невозможно. Есть, правда, одно исключение - const char * - да и то, если в заголовочном файле ещё не включен <string> -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |