Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/75: Рейтинг темы: голосов - 75, средняя оценка - 4.55
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32

Ссылки vs указатели - в чем разница?

21.11.2015, 20:04. Показов 16327. Ответов 150
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Навеяно соседней темой. Не понимаю в чем разница, хотя несколько раз честно пробовал почитать на эту тему, правда без должного внимания и усердия. Зато программировал на ассемблере и чистом С, понимаю абстракцию "адрес ячейки памяти" и "размер типа в байтах", с арифметикой указателей и указателями на указатели сложностей вроде не испытываю Есть переменная, если она не регистровая - то лежит в какой-то ячейке памяти (или нескольких, зависит от разрядности памяти и структуры типа переменной), адрес этой ячейки (ака указатель) я могу запоминать в другую переменную типа указателя, передавать/возвращать ее из функций, инкрементировать/декрементировать для движения по массиву переменных (если я его предварительно нарезал в той области памяти конечно), разыменовывать и получать/изменять значение. Вроде все. При чем тут термин "ссылки"? А еще оказывается бывают смартпоинтеры, умные указатели и прочие страшные слова
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.11.2015, 20:04
Ответы с готовыми решениями:

Указатели и ссылки: в чем разница
Здравствуйте, объясните, пожалуйста, в чем разница между "ссылается" и "указывает"?

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

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

150
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
21.11.2015, 20:13
Мне кажется, проще в книжке прочитать. На форуме своими словами ребята уже много раз объясняли.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.11.2015, 20:18  [ТС]
Да, наверное действительно лучше в книжках. Потому что и буквально эти, и подобные слова ребят на форумах и в других интернетах я читал неоднократно, но или понимания не наступает, или забывается сразу, или и то и другое.

Добавлено через 1 минуту
Даже список похожих тем внизу уже нравится )
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
21.11.2015, 20:18
Цитата Сообщение от _Ivana Посмотреть сообщение
смартпоинтеры
Цитата Сообщение от _Ivana Посмотреть сообщение
умные указатели
Одно и то же. Умные указатели - это классы, моделирующие поведение указателей. Любимы народом, потому как имеют деструктор, который освобождает память, когда указатель уже не нужен. В общем, вручную ничего делитить не надо.
Опять же, Прата:
Цитата Сообщение от Стивен Прата
Каждый из трех названных шаблонов интеллектуальных указателей (autoptr,
unique_ptr и shared_ptr) определяет подобный указателю объект, которому
присваивается адрес области памяти, полученный (прямо или косвенно) операцией new.
Когда срок существования интеллектуального указателя истекает, его деструктор
использует операция delete для освобождения памяти. Таким образом, присваивая
адрес, возвращенный операцией new, одному из этих объектов, не нужно беспокоиться
об освобождении памяти впоследствии; она будет освобождена автоматически при
удалении объекта интеллектуального указателя.
2
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
21.11.2015, 20:22
Ссылка это если объяснять человеческим языком - синтаксический сахар, позволяющий проводить оптимизацию без использования указателей контролируемую компилятором.

Собственно идеология С++ сделать язык безопасным и при этом быстрым и вводит в язык смартпоинтеры и всякие ссылки соответственно.

По-поводу современных ссылок, есть вот такая статейка
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
21.11.2015, 20:38
_Ivana, как-то так:
  1. Когда объект в функцию передаётся по значению, то создаётся копия объекта и внутри функции ты оперируешь копией.
  2. Когда объект в функцию передаётся по указателю, то внутрь функции передаётся адрес объекта и ты оперируешь самим объектом (оригиналом, а не копией).
  3. Когда объект в функцию передаётся по ссылке, то внутрь функции передаётся указание работать с объектом непосредственно и ты оперируешь самим объектом (оригиналом, а не копией). Это как если бы ты работал с указателем, который не надо разыменовывать.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.11.2015, 20:45  [ТС]
gru74ik, представь, что ты объясняешь это кому-то, кто не знает С++ (что и правда ). Ты бы сам понял из своего объяснения (которых полно подобных в инете) различие 2 и 3?

Добавлено через 1 минуту
Слова Nosey толкают к догадке, что за кадром это одно и то же, только по-разному синтаксически выражается в языке - чтобы наплодить дублирующих сущностей посрамив Оккаму наверное...
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.11.2015, 20:51
Цитата Сообщение от gru74ik Посмотреть сообщение
как-то так:
в функцию всегда передается копия аргументов, объявленых в прототипе.

вопрос лишь в том, копию чего вы передали.

копия ссылки - ссылка на оригинальный объект.
копия указателя - тупо адрес .
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
21.11.2015, 20:58
Цитата Сообщение от _Ivana Посмотреть сообщение
Слова Nosey толкают к догадке, что за кадром это одно и то же, только по-разному синтаксически выражается в языке
Именно так, можно рассмотреть три языка С, С++ и Java и вот С++ почти умудряется благодаря ссылкам и шаблонам усидеть их обоих, конечно "власть не бывает без ответственности" поэтому для идеального использования код конечно усложняется. Но это усложнение требуется далеко не везде, а в особенно критичных местах.
Вода The End.
А каким образом использовать ссылки написано во всех книгах.
И можно кратко добавить(что не описано в старых книгах) что современные ссылки ещё добавляют xvalue сслыки для реализации move семантики.
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.11.2015, 21:23  [ТС]
Просмотрел по диагонали ссылку (не указатель ) от Nosey, и понял, что наверное не буду я это все пытаться усвоить и постичь, а останусь на простом чистом С без загонов... А свободное время потрачу на другие интересные концепции других языков. Я не работаю с С++, мне пользы не принесет ни то ни другое, но второе кажется интереснее. Сорри за создание темы, спасибо за ответы, но наверное останусь без понимания этих вопросов.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
21.11.2015, 21:35
Цитата Сообщение от _Ivana Посмотреть сообщение
Ты бы сам понял из своего объяснения (которых полно подобных в инете) различие 2 и 3?
Я тебе уже в ЛС ответил. Хочешь - почитай. Нет - ну и ладно, ничего страшного. Невозможно (да и не нужно, наверное) знать всё. А у меня охоты пересказывать своими словами учебники нету.
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
21.11.2015, 22:27
Пусть мне надо поменять переменные x,y и я использую в программе change (x,y).
Программа написана, осталось написать сам change:
C++
1
2
3
4
5
6
7
void change(int a,int b) 
{
     int t;
     t=a;
     a=b;
     b=t;
}
Упс -не работает, ведь параметры надо передавать в стеке...
Что ж, заменим на указатели. Во-первых, везде, где писали change (x,y) надо писать change (&x,&y);
Во вторых, надо изменить саму функцию:
C++
1
2
3
4
5
6
7
void change(int *a,int *b) 
{
     int t;
     t=*a;
     *a=*b;
     *b=t;
}
Вроде пошло...

А теперь будем использовать не указатели, а ссылки:
C++
1
2
3
4
5
6
7
void change(int &a,int &b) 
{
     int t;
     t=a;
     a=b;
     b=t;
}
Все, в параметры функции добавили два амперсанда, в самой программе ничего менять не надо. Программа не знает, что теперь будет передаваться не объект, а его адрес.
Выводы: переход проще, сама функция смотрится наглядней, особенно если параметры - сложные объекты.
При вызове ничего менять не надо.
Если функция имеет параметр-ссылку, то объект она точно уничтожать не будет (и те функции, кому она его передаст, тоже не будут).

А в принципе, что можно сделать через ссылки, можно сделать и через указатели (только через ссылки удобнее).
При написании перегружаемых операторов, некоторых конструкторов требуется параметры описывать как ссылки.
Многие библиотечные функции используют параметры-ссылки, а мы этого можем не замечать (как в примере выше). И возвращают библиотечные функции (особенно ввода-вывода) часто не объекты, не указатели, а ссылки.

Кстати, я создавал специальную тему Особенности использования указателей и ссылок в C++ при возврате из функции, можно почитать.

Добавлено через 11 минут
Еще одна недавняя тема: Простое бинарное дерево
Сначала написал со ссылками, потом перевел на указатели (чтобы в Си работало). Со ссылками было понятней и компактней - не было конструкций типа (*Tree)->r->l=(*Tree)->r->r=NULL;
2
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
21.11.2015, 22:32
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
когда ссылка не может содержать "невалидные" данные.
она не может быть не инициализирована, а невалидные данные - пожалуйста, сколько влезет.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
21.11.2015, 22:36
Цитата Сообщение от Croessmah Посмотреть сообщение
а невалидные данные - пожалуйста, сколько влезет
тогда у нас разные взгляды на невалидность ссылки
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
21.11.2015, 22:41
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
на невалидность ссылки
угу. В моем понимании она не валидна, если ссылается черт знает на что.
Например, как вот тут: http://rextester.com/EQMC52074
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
21.11.2015, 22:48
Цитата Сообщение от Croessmah Посмотреть сообщение
угу
Вот видите. У нас разные взгляды ... .


Я считаю, что
void f(const Foo& obj)
{
// функция никак не определит "невалидность" ссылки - поэтому ссылка всегда валидна. А то, что туда могут дауны записать, что-то - так они могут и программу положить просто так. И что теперь?)
}
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
21.11.2015, 22:58
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
функция никак не определит "невалидность" ссылки
также, как и указателя
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
21.11.2015, 23:04
Цитата Сообщение от Croessmah Посмотреть сообщение
также, как и указателя
Как и по значению) Договаривайте.

Но в отличии от ссылок, указатель можно проверить на nullptr - и тем самым подкоректировать алгоритм.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.11.2015, 23:43
rikimaru2013, разница между неинициализированным указателем и невалидной ссылкой есть. По указателю можно записать что-то при чём "куда-то".
По ссылке такая запись безобидна ровно настолько насколько соответствует намерению программиста относительно данных. Адрес ведь уже определён созданной переменной на которую ссылаемся. Правда если сама переменная не инициализирована то при чтении будет скорее всего не то что хотелось, но всё же это не так больно. Выделенная память не принадлежит больше ни кому. Так что это
Цитата Сообщение от Croessmah Посмотреть сообщение
она не может быть не инициализирована, а невалидные данные - пожалуйста, сколько влезет.
вполне соответствует действительности. Неинициализированную ссылку просто нельзя создать, а указатель, - легко.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
22.11.2015, 00:32
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
поэтому ссылка всегда валидна
Ну не... Повсюду ж в стандарте, при описании различных функций контейнеров, написаны предупреждения: references may be invalidated.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Адрес ведь уже определён созданной переменной на которую ссылаемся. Правда если сама переменная не инициализирована то при чтении будет скорее всего не то что хотелось, но всё же это не так больно.
А если переменной по этому адресу уже нет, то будет все равно больно.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Но в отличии от ссылок, указатель можно проверить на nullptr - и тем самым подкоректировать алгоритм.
Ну nullptr - вполне валидное значение.

Кстати, кто-нибудь упоминал, что ссылки нельзя переназначать, а указатели можно?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.11.2015, 00:32
Помогаю со студенческими работами здесь

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

Ссылки и указатели
Добрый день. Возможно было. В чем существенная разница между передачей данных в функцию по ссылке или указателю. В каких случаях вы бы...

Указатели и ссылки [С++]
Всем привет. я тут программу делаю. Цель: определить,принадлежит ли точка заданному промежутку(а точнее лежит внутри или снаружи фигуры)....

Ссылки и указатели
Вот есть код в котором я проверял как ведут себя указатели : using namespace std; int* first() { int p = 5; cout <<...

Ссылки и указатели
Здравствуйте, может кто объяснить в чем будет отличие при передаче в функцию по **, *, *&, &(**), желательно на примерах простых


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru