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

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

21.11.2015, 20:04. Показов 17037. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
После бана на Пикабу не работает авторизация аккаунта с Яндекса.
Hrethgir 09.07.2026
В частности https:/ / auto. ru/ logbook/ zapret-na-vozhdenie-posle-65-let_1cf28789-07b4-4c75-a2f7-4cd4edf9deeb тут хотел оставить комментарий такой Зрите в корень - монополизация на разработку программ. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru