Форум программистов, компьютерный форум CyberForum.ru

Указатели или ссылки (в качестве аргументов функции) ? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 10:23     Указатели или ссылки (в качестве аргументов функции) ? #1
В каких случая надо использовать ссылки и в каких указатели в качестве аргументов функции?
В общем поняла, что и те и другие полезны для ссылания на крупные обьекты типа классов.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2013, 10:23     Указатели или ссылки (в качестве аргументов функции) ?
Посмотрите здесь:

C++ функции,указатели и ссылки.
Указатели на массивы в качестве аргументов C++
C++ Написать программу с использованием функции, которая сравнивает две строки, заданные в качестве её аргументов
Ссылки или указатели (Написать функцию , которая вычисляет гипотенузу, площадь и периметр прямоугольного треугольника) C++
Идентификаторы списка в качестве аргументов функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
24.05.2013, 14:56     Указатели или ссылки (в качестве аргументов функции) ? #41
Цитата Сообщение от Vourhey Посмотреть сообщение
Поясни
C++
1
2
    int *a=NULL;
    int &b = *a;
Имеется ввиду разыменование NULL
А потом еще и значение по нему прописать
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.05.2013, 15:25     Указатели или ссылки (в качестве аргументов функции) ? #42
Цитата Сообщение от taras atavin Посмотреть сообщение
Как он должен работать и как всё рано напишет какое нибудь чудило - далеко не одно и тоже, иначе глюков бы не было.
Какое-нибудь чудило может просто разыменовать nullptr, например, или сделать ещё миллион других вещей, которые приводят к неочевидному или непредсказуемому поведению.
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,208
Записей в блоге: 11
24.05.2013, 15:42     Указатели или ссылки (в качестве аргументов функции) ? #43
Цитата Сообщение от programina Посмотреть сообщение
В каких случая надо использовать ссылки и в каких указатели в качестве аргументов функции?
Марш читать "Брайан Керниган, Деннис Ритчи: Язык программирования C", а потом
"Бьерн Страуструп. Язык программирования С++", и найди несколько отличий.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.05.2013, 17:05     Указатели или ссылки (в качестве аргументов функции) ? #44
Цитата Сообщение от programina Посмотреть сообщение
в любом стандартном компилере
Проверь-ка.
Цитата Сообщение от Croessmah Посмотреть сообщение
Имеется ввиду разыменование NULL
Для взятия ссылки компилятор не станет разыменовывать указатель. При операции со ссылкой он просто возьмет значение указателя - адрес и сохранит его в ссылке. Разыменовывание его заинтересует, если бы слева была не ссылка. Теоретически, может, и UB, на практике не встречал. Собственно, поэтому и поинтересовался, какой компилер так сделает. Чисто с практической точки зрения интересно взглянуть на скомпилированный код.
Цитата Сообщение от Croessmah Посмотреть сообщение
А потом еще и значение по нему прописать
Значение не должно интересовать компилятор, когда слева стоит ссылка.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
24.05.2013, 17:14     Указатели или ссылки (в качестве аргументов функции) ? #45
Цитата Сообщение от Vourhey Посмотреть сообщение
Значение не должно интересовать компилятор, когда слева стоит ссылка.
Компилятор не должно, а вот во время выполнения...
BAADF00D
Заблокирован
24.05.2013, 17:20     Указатели или ссылки (в качестве аргументов функции) ? #46
Цитата Сообщение от Croessmah Посмотреть сообщение
Компилятор не должно, а вот во время выполнения...
рантайм в данном случае -- ошибка программиста, с т.з. компилятора тут ничего преступного нет.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.05.2013, 17:59     Указатели или ссылки (в качестве аргументов функции) ? #47
Цитата Сообщение от Croessmah Посмотреть сообщение
Компилятор не должно, а вот во время выполнения...
Ну компилятор же для времени выполнения код создает в случае с указателем, чтобы получить адрес того, на что он ссылается, не нужно ничье значение. Сгенеренный код будет класть значение указателя (не по указателю) в ссылку. Ну это, как я раньше всегда видел. Я не говорю, что это не UB. Просто интересно, для чего кому-либо и как может для ссылки понадобиться дереференс указателя, глянуть бы, раз уж про UB напомнили. А если никто, то вполне себе DB.

Добавлено через 35 минут
Ну а раз есть компиляторы, которые поведут себя ожидаемо и сделают из этого примера ссылку на нулевой адрес, то пример валиден и UB тут не при чем. Ссылка на NULL имеет место быть.
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,208
Записей в блоге: 11
24.05.2013, 18:31     Указатели или ссылки (в качестве аргументов функции) ? #48
Цитата Сообщение от Vourhey Посмотреть сообщение
валиден и UB тут не при чем
UB притом, что компилятор не вставляет код проверки указателя/ссылки при обращение, а дает на откуп менеджеру памяти, ОС и т.д.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.05.2013, 18:37     Указатели или ссылки (в качестве аргументов функции) ? #49
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
UB притом
UB не при чем, потому что ссылка на нулевой адрес возможна. И UB тут не поможет.
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
что компилятор не вставляет код проверки указателя/ссылки при обращение
Собственно, это и подтверждает, что ссылка будет нулевой. Что брать значение по указателю никто не будет.
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
дает на откуп менеджеру памяти
Любое обращение к памяти - это ОС, менеджер памяти. Только в данном случае будет лишь обращение к области памяти стека, а не к памяти, на которую указывает указатель.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
24.05.2013, 18:56     Указатели или ссылки (в качестве аргументов функции) ? #50
Цитата Сообщение от Vourhey Посмотреть сообщение
Собственно, это и подтверждает, что ссылка будет нулевой.
Она просто ссылается на элемент, который находиться по указанному адресу(0).
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.05.2013, 19:09     Указатели или ссылки (в качестве аргументов функции) ? #51
Vourhey, UB в терминах стандарта С++ - behavior for which this International Standard imposes no requirements.
Разыменование нулевого указателя не является UB только в одном контексте - в операторе typeid.
Ну и к слову: http://stackoverflow.com/questions/4...null-reference
Certain other operations are described in this International Standard as undefined (for example, the effect of dereferencing the null pointer)
Ну и в стандарте квалифицируется что null-reference просто не может быть в нормальной программе.
[ Note: in particular, a null reference cannot exist in a well-defined program, because the only
way to create such a reference would be to bind it to the “object” obtained by dereferencing a null pointer,
which causes undefined behavior.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.05.2013, 19:40     Указатели или ссылки (в качестве аргументов функции) ? #52
Цитата Сообщение от Croessmah Посмотреть сообщение
Она просто ссылается на элемент, который находиться по указанному адресу(0).
Я об этом и говорю.
Цитата Сообщение от ForEveR Посмотреть сообщение
UB в терминах стандарта С++
Я привел пример, который при компиляции сделает ссылку на нулевой адрес. По факту. Не по UB и стандарту. А раз может существовать - пример для этой темы - нормальней некуда. А не стандарт обсуждаю, а то, что ссылка не убережет от "ссылания" на невалидный адрес. А ты мне про стандарт.

Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
Разыменование нулевого указателя не является UB только в одном контексте
Создай тему про UB. Я не вижу связи между тем, что пишешь ты и между этой темой.

Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
Ну и в стандарте квалифицируется что null-reference просто не может быть в нормальной программе.
Поэтому я и написал про "глупости"
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
24.05.2013, 19:42     Указатели или ссылки (в качестве аргументов функции) ? #53
Цитата Сообщение от Vourhey Посмотреть сообщение
А не стандарт обсуждаю, а то, что ссылка не убережет от "ссылания" на невалидный адрес.
ссылка лишь должна инициализировать чем то, а валидность того на что она ссылается ей по барабану
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.05.2013, 19:45     Указатели или ссылки (в качестве аргументов функции) ? #54
Цитата Сообщение от Croessmah Посмотреть сообщение
ссылка лишь должна инициализировать чем то, а валидность того на что она ссылается ей по барабану
Зачем ты мне это говоришь? Просто, когда я привел пример того, как ссылка может ссылаться на невалидный адрес, как и указатель, то тут началась тема про UB. Хотя, я не вижу связи.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
24.05.2013, 19:47     Указатели или ссылки (в качестве аргументов функции) ? #55
Цитата Сообщение от Vourhey Посмотреть сообщение
Просто, когда я привел пример того, как ссылка может ссылаться на невалидный адрес, как и указатель, то тут началась тема про UB.
Просто все имели ввиду разные вещи
Вы - то что можно ссылку сделать не валидной, а лично я имел ввиду, что работать с не валидной ссылкой - UB
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2013, 19:49     Указатели или ссылки (в качестве аргументов функции) ?
Еще ссылки по теме:

C++ Константные указатели в качестве аргументов функций
C++ Дан файл, переписать его в обратном направлении, передавая имена файлов в качестве аргументов функции main
Ostream и ofstream в качестве аргументов полиморфной функции C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Vourhey
24.05.2013, 19:49     Указатели или ссылки (в качестве аргументов функции) ?
  #56

Не по теме:

Ладно, фиг со всем тогда. Все о разном

Yandex
Объявления
24.05.2013, 19:49     Указатели или ссылки (в качестве аргументов функции) ?
Ответ Создать тему
Опции темы

Текущее время: 21:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru