Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/55: Рейтинг темы: голосов - 55, средняя оценка - 4.55
2 / 2 / 0
Регистрация: 24.11.2016
Сообщений: 77

Указатели и ссылки: в чем разница

08.07.2017, 18:55. Показов 11878. Ответов 85
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, объясните, пожалуйста, в чем разница между "ссылается" и "указывает"?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.07.2017, 18:55
Ответы с готовыми решениями:

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

Указатели и ссылки: в чём их разница и сходство?
Я начал учить с++ и не могу кое в чём разобраться. Кто знает ответы на эти вопросы может ответить или скинуть какую нибудь ссылку где это...

в чем разница? массивы и указатели строк
В примере Дейтла ( в документе ) массивы строк инициализируются через указатели, при этом компилятор выдает ошибки. Я же инициализоравал...

85
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.07.2017, 20:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от daun-autist Посмотреть сообщение
Так покажи нам их!
Так показал. Выравнивание/размер ссылки, равен размеру/выравниванию структуры состоящей из одной этой ссылки.
Ты же требуешь не показать размер занятый ссылкой, а измерить его запихав саму ссылку в sizeof. А память в структуре наверно барабашка съел.
Цитата Сообщение от oldnewyear Посмотреть сообщение
References are not objects; they do not necessarily occupy storage
Конечно, конечно. Аргумент функции char& может иметь четыре миллиарда различных значений (ссылаться на любой байт), но при этом не обязан занимать память. Видимо, все эти четыре миллиарда значений будут извлекаться из хрустального шара.
0
Заблокирован
09.07.2017, 20:47
Цитата Сообщение от Renji Посмотреть сообщение
Выравнивание/размер ссылки, равен размеру/выравниванию структуры состоящей из одной этой ссылки.
Я хочу видеть размер и выравнивание ссылки, а не какой-то там структуры.

Цитата Сообщение от Renji Посмотреть сообщение
при этом не обязан занимать память
А где написано, что обязан?

Цитата Сообщение от Renji Посмотреть сообщение
Видимо, все эти четыре миллиарда значений будут извлекаться из хрустального шара.
Да хоть так, пока это не нарушает семантику языка.
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
09.07.2017, 20:55
Цитата Сообщение от Renji Посмотреть сообщение

Конечно, конечно. Аргумент функции char& может иметь четыре миллиарда различных значений (ссылаться на любой байт), но при этом не обязан занимать память. Видимо, все эти четыре миллиарда значений будут извлекаться из хрустального шара.
Не из хрустального шара, а из объекта, которым инициализирована ссылка
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.07.2017, 21:00
Цитата Сообщение от oldnewyear Посмотреть сообщение
Не из хрустального шара, а из объекта, которым инициализирована ссылка
Чего-чего? У меня три объекта - Char1, Char2, Char3. Ты предлагаешь в них хранить информацию о том, кого именно я в функцию сунул в качестве char& аргумента? Ну окей, будем хранить информацию в объектах. Каким мистическим способом предлагается это сделать, не расходуя ни бита памяти?
Цитата Сообщение от daun-autist Посмотреть сообщение
Я хочу видеть размер и выравнивание ссылки, а не какой-то там структуры.
Вот я и говорю, тебе надо не продемонстрировать что ссылка жрет память, а измерить сожранное строго определенным образом. Иначе это не ссылка память съела, а барабашка.
Цитата Сообщение от daun-autist Посмотреть сообщение
А где написано, что обязан?
То ли в принципе Дирихле, то ли в определении объема информации, как двоичного логарифма от числа состояний. Короче, в отсутствующем в стандарте матане. Если в твоей вселенной матан отменили, то конечно можно его во внимание не принимать.
Цитата Сообщение от daun-autist Посмотреть сообщение
Да хоть так, пока это не нарушает семантику языка.
Семантике языка никак не противоречат и указатели фактическим размером ноль байт, для которых sizeof возвращает ненулевое значение (as-if rule).
0
Заблокирован
09.07.2017, 21:09
Цитата Сообщение от Renji Посмотреть сообщение
Вот я и говорю, тебе надо не продемонстрировать что ссылка жрет память, а измерить сожранное строго определенным образом.
Есть определённый стандартом способ определения размера объекта — sizeof. Я и хочу увидеть его значение для ссылки.
А то мы таким образом договоримся до того, что padding-и являются объектами, ведь они занимают место.

Цитата Сообщение от Renji Посмотреть сообщение
Семантике языка никак не противоречат и указатели фактическим размером ноль байт, для которых sizeof возвращает ненулевое значение (as-if rule).
Да-да. As-if rule ты наш, покажи sizeof и alignof ссылки наконец.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.07.2017, 21:36
Цитата Сообщение от daun-autist Посмотреть сообщение
А то мы таким образом договоримся до того, что padding-и являются объектами, ведь они занимают место.
Являются частью памяти выделенной под эти объекты, да. Даже если объект не использует эти байтики непосредственно, выделены они именно под его нужды (обеспечение выравнивания).
А договоримся мы до того, что структура толстеет от сырости. Ну раз уж потребителей памяти у нее внутри нет, а сама память почему-то расходуется, остается только сырость винить.
0
Заблокирован
09.07.2017, 21:39
Renji, в общем, я так понимаю, подтверждения того, что "ссылка является объектом" не будет.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.07.2017, 21:45
Цитата Сообщение от daun-autist Посмотреть сообщение
Renji, в общем, я так понимаю, подтверждения того, что "ссылка является объектом" не будет.
Напоминаю начало разговора - "Ссылка занимает определенный объем памяти. Никакой другой объект не может занимать этот объем одновременно с ней. В этом смысле она объект.".
Ну а доказательств того что структура с ссылкой больше структуры без ссылки, потому что ссылка память жрет - да, не будет. Признаю, возможно что память кушает барабашка, почему-то появляющийся там же где ссылки.
0
Заблокирован
09.07.2017, 21:49
Цитата Сообщение от Renji Посмотреть сообщение
Напоминаю начало разговора
Да, спасибо, я помню.
Цитата Сообщение от Renji Посмотреть сообщение
Ссылка занимает определенный объем памяти.
Это так и не было показано. Только предъявлялся sizeof какой-то структуры. Короче, происходило то, что называется "подмена понятий".
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.07.2017, 21:57
Цитата Сообщение от daun-autist Посмотреть сообщение
Это так и не было показано. Только предъявлялся sizeof какой-то структуры. Короче, происходило то, что называется "подмена понятий".
Происходило то что называется "косвенное наблюдение".
А "подмена понятий" это когда "невозможно непосредственно вытрясти из компилятора сколько он потратил на ссылку", подменяется на "компилятор не выделяет память под ссылку".
0
Заблокирован
09.07.2017, 22:13
Цитата Сообщение от Renji Посмотреть сообщение
Происходило то что называется "косвенное наблюдение".
В стандарте есть чёткие определения, что является объектом, а что нет и что такое размер объекта. Какие ещё "косвенные наблюдения" определений?

Цитата Сообщение от Renji Посмотреть сообщение
А "подмена понятий" это когда "невозможно непосредственно вытрясти из компилятора сколько он потратил на ссылку", подменяется на "компилятор не выделяет память под ссылку".
Да вообще похрену на компиляторы. Есть они или нет — на семантику языка это не влияет.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.07.2017, 22:18
Цитата Сообщение от daun-autist Посмотреть сообщение
В стандарте есть чёткие определения, что является объектом, а что нет и что такое размер объекта. Какие ещё "косвенные наблюдения" определений?
Я сказал "ссылка занимает определенный объем памяти", а не "по стандарту ссылка имеет ненулевой размер".
От того как стандарт обзовет занятые ссылкой байтики, они в свободные байтики не превратятся.
0
Заблокирован
09.07.2017, 22:38
Цитата Сообщение от Renji Посмотреть сообщение
ссылка занимает определенный объем памяти
Приведи это определение.

Добавлено через 10 минут
Цитата Сообщение от Renji Посмотреть сообщение
Ссылка занимает определенный объем памяти. Никакой другой объект не может занимать этот объем одновременно с ней. В этом смысле она объект.
Стандарт может говорить про то, что два разных объекта не могу занимать одну память одновременно.
Отсюда не следует, что если что-то не занимает определённый объём памяти одновременно с объектом, то это что-то — объект; это элементарный закон логики.
Если ты думаешь, что следует — у тебя явно проблемы с мышлением. Купи себе учебник по логике.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.07.2017, 22:43
Цитата Сообщение от daun-autist Посмотреть сообщение
Приведи это определение.
Определяется реализаций на конкретной платформе.
Цитата Сообщение от daun-autist Посмотреть сообщение
Стандарт может говорить про то, что два разных объекта не могу занимать одну память одновременно.
Отсюда не следует, что если что-то не занимает определённый объём памяти одновременно с объектом, то это что-то — объект; это элементарный закон логики.
Еще раз: "ссылка занимает определенный объем памяти. Никакой другой объект не может занимать этот объем одновременно с ней. В этом смысле она объект."

Ты где в этой цитате видишь "по стандарту ссылка==объект"? Ну а что себе купить - подумай сам.
0
Заблокирован
09.07.2017, 22:49
Цитата Сообщение от Renji Посмотреть сообщение
Ты где в этой цитате видишь "по стандарту ссылка==объект"?
Я написал, что "Начать можно с того, что указатель является объектом, а ссылка — нет.". Ты процитировал это в своём ответе, который был меньше всего похож на то, что ты с этим согласен; скорее — не согласен.

Какие кто вкладывает смыслы в термин "объект" в своей голове — я не собираюсь догадываться. Для меня важно только значение этого термина.

Кликните здесь для просмотра всего текста
Впрочем, чем смысл отличается от значения ты вряд ли знаешь.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
09.07.2017, 23:01
Цитата Сообщение от daun-autist Посмотреть сообщение
Ты процитировал это в своём ответе, который был меньше всего похож на то, что ты с этим согласен; скорее — не согласен.
Я не согласен с "И этим они различаются фундаментально.". Классификация "объект-не объект" на написание программы влияет чуть более чем никак. Как будто то что ссылку объявили не объектом, как-то помешает мне написать int&ref1=ref2. И от того что в стандарте написано "мы не против если ссылка не будет кушать память", ссылка не перестанет волшебным образом эту память кушать. Хотя конечно, если нам не программировать, а на экзаменационный билет отвечать, то разница да, принципиальна.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
10.07.2017, 00:46
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Renji, ссылка и указатель отличаются именно фундаментально на уровне языка.

Выделим различия, которые так или иначе присутствуют:
* ссылка должна быть обязательно инициализирована, указатель не обязан;
* нельзя сделать ссылку на "нулевой объект" в корректной программе, указателю может быть nullptr;
* ссылку нельзя "переназначить", указатель - можно;
* синтаксис с ссылками проще читать;
* указатель - адрес, ссылка - псевдоним;
* мы не можем без proxy-чего-то взять указатель на временный объект,
однако создать ссылку на такой объект можем;
* ссылкой можно продлить время жизни временного объекта, указателем - нет;
* указатель всегда занимает память (не берем в расчет оптимизации),
для ссылки данный критерий неспецифицирован вовсе,
т.е. если мы сможем настроить компилятор так, чтобы он вообще ничего не вырезал,
то вырезать указатель он не сможет, а вырезание ссылки -
законное поведение, т.к. она может законно не занимать память;
* нельзя содать массив ссылок, массив указателей - можно;
* нельзя сделать ссылку на ссылку, указатель на указатель - можно;
* нельзя сделать указатель на ссылку, но ссылку на указатель можно;
* с помощью указателя будет проблематично обозначить "ненужный далее" объект;
* в шаблонах нужно четко понимать различия ссылок и указателей,
эти различия могут существенно повлиять на код.
* пока печатал, возможно, что-то забыл. Спать пора.
4
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.07.2017, 01:29
Цитата Сообщение от Croessmah Посмотреть сообщение
* нельзя сделать ссылку на "нулевой объект" в корректной программе
можно.
и это много где применяется.

например, вот такой кейс:
C++
1
decltype(foo( ::std::declval<T>()  ));
сделать нулевую ссылочку можно.
можно передавать её в аргументах.
её нельзя читать.

Цитата Сообщение от Croessmah Посмотреть сообщение
* ссылку нельзя "переназначить", указатель - можно;
нельзя законным образом.
я сейчас с планшета.
так что не могу привести явных примеров кодом.
но вот рецепты:

1.1
делаем поле класса ссылкой.
смотрим sizeof класса, и обращаем внимание,
1.2
что ссылка чего то, да весит.
делаем сильное предположение - компилятор профигачил ссылочное поле,
как авто-разыменовывающийся указатель.

1.3
далее по смещению от this, с учетом типов полей и выравнивания,
получаем адрес референсного поля.
1.4
вписываем в память поля адрес другой переменной.

ПРОФИТ???!!!!

2.1
создаем обычную локальную ссылку где нибудь на стеке.
2.2
создаем функцию-детектор.
она должна быть элипсисом (с тремя точками)
2.3
передаем вторым параметром ссылку.
2.4
получаем доступ к второму параметру через стандартные сишные макросы
при этом тип аргумента определяем как указательный.
2.5
меняем значение по указателю,
и убеждаемся:
значение оригинального объекта корректно изменилось.
а значит компилятор реально профигачил ссылку в аргументах элипсиса,
как обычный указатель.
2.6
по аналогии с полем класса вписываем по значению указателя новый адрес.
2.7 ПРОФИТ???

оба способа - UB в чистом виде.

сработает, только если не дать компилятору
чего нибудь там с оптимизировать.

в однофайловом проекте компилятор
запросто может профигачить inline подстановками
все места использования,
например.
0
Заблокирован
10.07.2017, 01:37
Цитата Сообщение от hoggy Посмотреть сообщение
например, вот такой кейс:
C++
1
decltype(foo( ::std::declval<T>() *));
Это unevaluated context. declval тут не вызывается, и ссылка ни нулевая, ни ненулевая.

Цитата Сообщение от hoggy Посмотреть сообщение
нельзя законным образом.
Другие тут и не обсуждаются. А мамкиным какирством типа memcpy поверх структуры со ссылкой можно удивить разве что одноклассников.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
10.07.2017, 01:42
Цитата Сообщение от Croessmah Посмотреть сообщение
Renji, ссылка и указатель отличаются именно фундаментально на уровне языка.
То что отличия есть - никто не спорит. Но значительное число действий в равной степени возможны и для того, и для того. А под капотом там вообще одно и тоже.
Цитата Сообщение от Croessmah Посмотреть сообщение
* ссылку нельзя "переназначить", указатель - можно;
При желании можно - засунуть в структуру и placement new ее. Хотя да, это уже из серии сравнительно честного обмана системы типов.
Цитата Сообщение от Croessmah Посмотреть сообщение
* указатель всегда занимает память (не берем в расчет оптимизации),
для ссылки данный критерий неспецифицирован вовсе,
Что бессмысленно чуть менее чем полностью. С переменными компилятор и так творит что хочет. И у него может быть как ключик запрещающий вырезать указатели, так и ключик запрещающий вырезать ссылки. Теоретически можно было бы использовать ссылки нулевого размера, чтобы сократить структуры их содержащие. Но для этого надо чтобы ссылка была известна на стадии компиляции. Кто и зачем будет делать не статическое поле со значением известным на стадии компиляции?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.07.2017, 01:42
Помогаю со студенческими работами здесь

Ссылки и указатели - в чем преимущество одного над другим
Известно, что главной причиной появления ссылок в С++ было дать более безопасную альтернативу указателям в некоторых ситуациях. Ссылка в...

Указатели и ссылки c++
Здравствуйте! Не могли бы вы объяснить как можно использовать ссылки и указатели c++ на практике? Я не пойму для чего они нужны!

Ссылки и указатели
#include &lt;iostream&gt; using namespace std; int main() { int *n=new int{1,2}; cout&lt;&lt;&amp;n&lt;&lt;' '&lt;&lt;&amp;n&lt;&lt;' '&lt;&lt;&amp;n&lt;&lt;endl; return...

Указатели и ссылки
Добрый день, есть вопросы по поводу указателей и ссылок в параметрах функций. Правильно ли я понимаю, что есть по сути 2 варианта, либо...

Ссылки и указатели
Добрый день, не могу понять чем помогают при использовании указатели и ссылки? Есть код на c++ #progma once class well { ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru