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

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

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

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

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

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

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

150
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
26.11.2015, 13:02
Студворк — интернет-сервис помощи студентам
Evg
Использование ссылок в C++ без использования оптимизации, всё равно, что брачная ночь без невесты.
Ссылки специально оговариваются стандартом как некоторая абстракция без уточнения конкретной реализации.
Если передавать параметры по ссылке на неизменяемые данные, то компилятор может провести оптимизацию для данной платформы: когда надо передать через указатель, а когда можно и нужно -- скопировать. Мы не почувствуем разницы, но и не рискуем вляпаться в дыры "преждевременной оптимизации".

Именно возможности "оптимизации по необходимости" для управляемых языков позволяют им быть сегодня почти такими же быстрыми, как и низкоуровневые языки.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.11.2015, 13:18
Цитата Сообщение от mporro Посмотреть сообщение
Использование ссылок в C++ без использования оптимизации, всё равно, что брачная ночь без невесты
Цитата Сообщение от mporro Посмотреть сообщение
то компилятор может провести оптимизацию для данной платформы
Про этот момент я всё русским языком написал. Когда ты начинаешь думать о том, что может или не может сделать компилятор, то ты начинаешь заглядывать вовнутрь абстракции

Если ты хочешь писать эффективный код, ты должен понимать, в какой реальный код машины выливается та или иная конструкция и как с ней отработает компилятор (может или не может оптимизировать и в какой мере). Пока ты живёшь на уровне абстракций, у тебя нет возможности думать обо всех вещах, следовательно, ты не можешь реально оценить/управлять эффективность работы своего кода
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
26.11.2015, 13:22
Цитата Сообщение от Evg Посмотреть сообщение
"зачем нужна ссылка" ответ дать сложно
Ну, Страуструп говорит, что ссылки были введены в основном для поддержки перегрузки операторов, ибо
a = b - c;
выглядит красивше, чем
a = &b - &c;
2
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
26.11.2015, 13:28
Цитата Сообщение от Evg Посмотреть сообщение
ты не можешь реально оценить/управлять эффективность работы своего кода
Не могу. Но мне и не нужно! Этим управляет компилятор. Он это умеет гораздо лучше меня.
А я гораздо лучше разбираюсь в абстракциях предметной области, чтобы написать макроязык.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
26.11.2015, 13:30
Цитата Сообщение от IGPIGP Посмотреть сообщение
Евгений хорошо показал, что например, для встроенных типов, регистровая переменная быстрее чем адрес на неё. Копия переданная через стек вряд ли быстрее. А как быть с массивами, большущими структурами/классами?
Ну так ссылки и предназначены для больших объектов. Какой смысл передавать по ссылке маленький?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.11.2015, 13:45
Цитата Сообщение от Mr.X Посмотреть сообщение
Какой смысл передавать по ссылке маленький?
Чтобы и вернуть значение по ссылке, например. И не использовать при этом указатель. Хотя про большие объекты, это правда.

Добавлено через 8 минут
Цитата Сообщение от Mr.X Посмотреть сообщение
для поддержки перегрузки операторов,
Это ни кто не вспомнил! Да, ведь для серийных (маниакальных)) операторов типа присваивания или ввода-вывода в поток нужно возвращать ссылку, тогда можно:
C++
1
cout<<(a=b=c)<<d<<e;
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
26.11.2015, 13:47
Цитата Сообщение от IGPIGP Посмотреть сообщение
Чтобы и вернуть значение по ссылке, например.
Не, в примере Evg константная ссылка.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.11.2015, 13:54
Цитата Сообщение от Mr.X Посмотреть сообщение
Не, в примере Evg константная ссылка.
Тут мы не поняли друг друга. Я отвечал на:
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну так ссылки и предназначены для больших объектов. Какой смысл передавать по ссылке маленький?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.11.2015, 14:43
Цитата Сообщение от Mr.X Посмотреть сообщение
выглядит красивше, чем
Вряд ли страуструп говорил про "красивше". Ради этого не станут заводить новых сщностей

Цитата Сообщение от mporro Посмотреть сообщение
Не могу. Но мне и не нужно! Этим управляет компилятор. Он это умеет гораздо лучше меня
Ну вот 90% программистов так и думает. Потому и имеем то, что скорость процессоров и объём памяти растут, а софт становится всё медленнее и медленнее. Потому что нагородили программных абстракций, а разбираться, как ими эффективно пользоваться, никто не хочет - типа это забота компилятора, а не моя
3
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
26.11.2015, 15:02
Цитата Сообщение от Evg Посмотреть сообщение
Вряд ли страуструп говорил про "красивше". Ради этого не станут заводить новых сщностей
Ну да, он прагматически заявил, что нотация должна быть удобной, а я, как эстет, выразил это в своих терминах.
Однако такая новая сущность, как перегрузка операторов, введена, по сути, только для того, чтобы было красивше (ну, или удобнее).
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.11.2015, 15:14
Цитата Сообщение от Mr.X Посмотреть сообщение
чтобы было красивше
Когда люди отошли от прямого написания машинного кода, они сразу погрязли в красоте.
Красота требует ссылок. Красота спасёт стек! Красота страшно эффективная сила.
1
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
26.11.2015, 15:24
Цитата Сообщение от Evg Посмотреть сообщение
а софт становится всё медленнее
Опыт говорит строго об обратном: софт замедляется как только программисты лезут в абстракции, считая себя умнее компилятора.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
26.11.2015, 15:48
Цитата Сообщение от IGPIGP Посмотреть сообщение
Когда люди отошли от прямого написания машинного кода, они сразу погрязли в красоте.
Красота требует ссылок. Красота спасёт стек! Красота страшно эффективная сила.
Ну дак некрасивое и не полетит, как совершенно справедливо заметил мудрый Туполев!
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.11.2015, 16:14
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну да, он прагматически заявил, что нотация должна быть удобной, а я, как эстет, выразил это в своих терминах.
Я не про само слово "красивше", а про суть

Цитата Сообщение от Mr.X Посмотреть сообщение
Однако такая новая сущность, как перегрузка операторов, введена, по сути, только для того, чтобы было красивше (ну, или удобнее)
А мне вот казалось, что ради шаблонов. Чтобы шаблоны для скалярных и составных типов можно было написать одинаково

Цитата Сообщение от mporro Посмотреть сообщение
Опыт говорит строго об обратном: софт замедляется как только программисты лезут в абстракции, считая себя умнее компилятора
Я не понимаю, что такое "лезут", да и не предлагал я никуда "лезть". Я предлагал матчасть учить (т.е. понимать, как абстракции работают), чтобы правильно ими пользоваться
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
26.11.2015, 16:28
Цитата Сообщение от Evg Посмотреть сообщение
Я не понимаю, что такое "лезут"
То есть, пытаются строить свой код не на контракте абстракции, а на основе деталей реализации.

Цитата Сообщение от Evg Посмотреть сообщение
Я предлагал матчасть учить
Матчасть ссылки -- псевдоним объекта. Всё.
Как она реализована? Не знаю!
В одном месте программы компилятор может реализовать её указателем, в другом копией, в третьем -- квантовым запутованием.
Абстракция может быть реализована огромным количеством способов и компилятор, опираясь на то какая операционная система, какое железо и т.п. может сделать правильный выбор реализации в конкретной точки программы. Это центральное преимущество JIT компиляции, которое уже сегодня даёт возможность на C# написать код столь же быстрый, что и на С++. То есть, чтобы обогнать приложение под Windows на C# придётся приложить несоразмерные усилия. Вот мощь абстракции!
2
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
26.11.2015, 17:03
Вот так абстрагируешься, абстрагируешься, а потом смотришь и понимаешь, что не фига не понимаешь и приходится нарушать абстракции.
C++
1
2
3
4
5
6
7
8
9
10
11
int& fr(const int &y){
  static  int x=0;
  x+=y;
  return x;
}
 
int main(){
   int x=15;
   fr(x)+=fr(x);
   cout << fr(x) ;
}
А в итоге нарушения абстракции можно получить дополнительные плюшки синтаксиса.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
26.11.2015, 17:07
Цитата Сообщение от Evg Посмотреть сообщение
А мне вот казалось, что ради шаблонов. Чтобы шаблоны для скалярных и составных типов можно было написать одинаково
На самом деле нет. Перегрузка операторов появилась в 1985 году (целью были комплексные числа, матрицы, и т.п.), а шаблоны обнародованы в проекте в 1988 году.
Еще одно подтверждение того, что красивое и полезное вещи в чем-то схожие.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
26.11.2015, 17:18
daslex
Если везде понатыкать побочных эффектов, то можно любой код сделать нечитаемым.
В данном примере fr не определяет абстракцию, так как ей невозможно пользоваться без знания внутренних деталей.
Вот как раз такие ситуации, когда начинают мутить воду: я вот тут кусочек памяти сэкономлю, а здесь пару тактов выиграю... в результате приводят к коду, который полон утечек памяти, еле ползёт и его невозможно поддерживать.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
26.11.2015, 17:25
Да ладно. Там как раз вообще ничего знать не надо. Достаточно знать конечные результаты.
Вы яростно оперируете понятием абстракция, абстрагировавшись от определения абстракции.
0
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
26.11.2015, 17:38
daslex
fr не синоним переменной x или произвольной переменной, или своего аргумента.
fr была бы синонимом счётчика, если бы возвращала новое состояние.
int fr(const int& x); В противном случае Вы нарушаете абстракцию, нарушая инкапсуляцию.

P.S.
Смоделировать абстракцию с побочными эффектами вообще не самая простая затея. Прежде всего следует рассмотреть все варианты с иммутабельными данными.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.11.2015, 17:38

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru