Ссылки vs указатели - в чем разница?21.11.2015, 20:04. Показов 17095. Ответов 150
Метки нет (Все метки)
Навеяно соседней темой. Не понимаю в чем разница, хотя несколько раз честно пробовал почитать на эту тему, правда без должного внимания и усердия. Зато программировал на ассемблере и чистом С, понимаю абстракцию "адрес ячейки памяти" и "размер типа в байтах", с арифметикой указателей и указателями на указатели сложностей вроде не испытываю
Есть переменная, если она не регистровая - то лежит в какой-то ячейке памяти (или нескольких, зависит от разрядности памяти и структуры типа переменной), адрес этой ячейки (ака указатель) я могу запоминать в другую переменную типа указателя, передавать/возвращать ее из функций, инкрементировать/декрементировать для движения по массиву переменных (если я его предварительно нарезал в той области памяти конечно), разыменовывать и получать/изменять значение. Вроде все. При чем тут термин "ссылки"? А еще оказывается бывают смартпоинтеры, умные указатели и прочие страшные слова
0
|
|
| 21.11.2015, 20:04 | |
|
Ответы с готовыми решениями:
150
в чем разница? массивы и указатели строк |
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|||
| 22.11.2015, 15:26 | |||
|
А доказательством является вывод пар строк reference || other? Если мой вариант ошибочен и decltype каким-то непостижимым образом даёт инфу правильнее, я бы с радостью это хотел узнать, пожалуйста. #include <iostream>, вариться мне в котле за это века вечные ![]() А также надеялся что __FUNCSIG__ определён в vc, но этого не знал, сорри.
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 22.11.2015, 15:31 | |
|
0
|
|
| 22.11.2015, 15:39 | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 22.11.2015, 15:42 | ||
|
завтра регтестер почистится, и ваша ссылка станет не валидной. что тогда?
0
|
||
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
||
| 22.11.2015, 16:06 | ||
|
Не по теме:
П.с. можно в личку. Так что насчёт decltype, он работает лучше в данном контексте?
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||
| 22.11.2015, 16:33 | |||||||||||||
|
представьте себе, что вам задали вопрос: какой тип данных является ссылочным? вы можете по разному ответить на этот вопрос. а можете сделать отсылку к первоисточнику:
которые являются ссылочными типами. можно смело утверждать, что раз std::is_reference вернула true, значит тип данных действительно является ссылочным. результатом decltype( имя-переменной ) является тип переменной указанной в скобочках. на самом деле decltype работает не только с именем переменной, но и вообще с любой конструкцией языка, которая может обозначать объект. и возвращает тип этого объета. таким образом в коде:
вне зоны действия сети? получается, что вы - бесполезный источник информации. а вот если бы вы не только ссылку на онлайн компилятор положили, но и сам исходный код тоже выложили - проблем бы не было. любой желающий всегда сможет получить работоспособную пример-иллюстрацию.
0
|
|||||||||||||
|
83 / 10 / 8
Регистрация: 17.11.2015
Сообщений: 39
|
||||||
| 22.11.2015, 16:55 | ||||||
0
|
||||||
|
Комп_Оратор)
|
||
| 22.11.2015, 18:03 | ||
|
const T* путаете с T* const " ?! ![]() Ссылку на константу тоже часто называют "константной ссылкой". Легче произносить потому что. ![]() Но ссылка константна по природе и не нужно её объявлять таковой. Это потому что невозможно присвоить одну ссылку другой. При попытке всегда происходит присвоение значения. То есть ссылка в принципе неизменяемый объект и объявлять его таковым не имеет смысла. Поэтому присвоение ссылки как и константы любого типа возможна только в момент объявления. То есть требуется явная инициализация. (О том как это в конструкторах делается не нужно иначе всю жизнь будем толочь). А указатель, - сколько угодно можно присваивать. Если он не объявлен константным (не на константу а именно константным).
0
|
||
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
||
| 22.11.2015, 20:02 | ||
|
И касательно константных ссылок, я тут поковырялся, скажу честно никогда не сталкивался, да и не использовал в метапрограммирование is_const, полагался на пользователя. Проверив ваш код, я согласен с утверждением const int& r = v; - ссылка на константные данные, а std::is_const - проверяет константность самого типа. т.е. еслиб мы могли написать int& const r = v; то std::is_const отработал. Мы можем проверить непосредственно константность данных предварительно убрав ссылку через std::remove_reference
0
|
||
|
Комп_Оратор)
|
|||||||
| 22.11.2015, 21:15 | |||||||
|
Вообще, новичку тут тяжко что-то вычитать. Но кому было легко? Хочу простую вещь вспомнить. Никто не вспоминает потому, что она давно уже кажется естественной как воздух. Хотя каждый когда видел впервые наверное балдел. Есть языки в которых вызов по ссылке пишется специальным образом. В C# для этого служит ключевое слово ref. Оно пишется перед каждым аргументам в месте вызова. Иначе не скомпилируется. Это не спроста. Это потому, что иначе в месте вызова не видно по ссылке или по значению передан аргумент. Ещё хуже то, что компилятор не имеет возможности понять какая перегрузка должна быть вызвана если присутствуют оба варианта: и по ссылке и по значению. То есть код с такой перегрузкой просто не компилируется. В C++ не скомпилируется. Не удивительно, что мозг новичка не компилирует такой синтаксический подход тоже. Ну то есть простой пример из давно забытого:
0
|
|||||||
|
83 / 10 / 8
Регистрация: 17.11.2015
Сообщений: 39
|
|||||||
| 23.11.2015, 01:12 | |||||||
1
|
|||||||
|
Комп_Оратор)
|
||
| 23.11.2015, 11:29 | ||
|
Я говорил о передаче lvalue. Это видно из сравнения с C# и из приведенного кода. Хотя любые ограничения обходятся созданием новой переменной. То есть можно говорить до бесконечности. За приведенные примеры спасибо про rvalue и кастинг знал, остальное - интересно. Плюсы вообще интересны тем, что пока не вызовешь, код как Домоклов меч, - не проверяется.
1
|
||
| 25.11.2015, 09:21 | ||||||
|
Интересно, что результат будет разный, хотя сам вызов одинаковый.
Вроде и там и там компилятору говорят "передается массив из 2 элементов", однако ж...
1
|
||||||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||
| 25.11.2015, 10:16 | ||
|
2) Надо читать предупреждения компилятора, они для кого? 3) Просто везение для zer0mail, что результаты разные. Так уж сложилось, что зачем-то собирается 32-битная версия Собиралась бы 64-битная, тогда с большой вероятностью везде выдало 8. Так бы и думал, что разницы никакой.
1
|
||
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
|
| 25.11.2015, 10:45 | |
|
2
|
|
|
|
|||
| 25.11.2015, 11:09 | |||
|
Добавлено через 1 минуту И ещё если бы тип был не int, а char, то было бы ещё проще
0
|
|||
|
Комп_Оратор)
|
|||||||
| 25.11.2015, 11:59 | |||||||
![]() Куче народу может быть интересно. Вот я не уверен но мог бы сказать следующее: Ссылка как сущность в области и как механизм передачи в функцию это не одно и то же, хотя обозначаются похоже. На эту тему ошибаются все. Тут даже не в опыте дело. У меня, например, - если давно рыбы не ел + пасмурно, ещё и не такое может получиться. zer0mail, смотрите:
![]() ps про поводу того что имена это ссылки не нужно иначе запутаем всё опять. Важно что когда это специально не оговорено то можно сказать "переменная"
0
|
|||||||
|
|
|
| 25.11.2015, 13:12 | |
|
Вообще изначально вопрос был задан в виде "в чём разница между указателями и ссылками". Таких тем на форуме море и в основном они стандартно перетекают в обсуждение "что такое ссылка" и споры на тему "ссылка это синоним объекта" vs "ссылка это константный указатель"
На тему последнего мне давно хотелось высказаться, но вот только сейчас пришло понимание, как это сделать более понятно. Оба определения (про синоним и про константный указатель) по своему смыслу являются правильными. Различие между этими определениями в том, что объяснение про синоним - математическое (абстракция), а объяснение про указатель - программерское (реализация абстракции) Рассмотрим следующий пример. В нём две связки функций: aaaaa-bbbbb и ccccc-ddddd. По смыслу они делают одно и то же, просто в первом случае параметр функции передаём по значению, а во втором - через ссылку. Если рассуждать математически, то в первом случае при передаче параметров создаётся копия переменной, а во втором - вместо копии создаётся синоним переменной. И опять-таки если рассуждать математически, то второй вариант (с ссылкой) кажется более быстрым, т.к. в нём НЕ создаётся копии, а создаётся лишь синоним, который интуитивно кажется конструкцией, ничего лишнего не создающей C++ int aaaaa (int p) { return p + 1; } int bbbbb (void) { int x; x = 10; return aaaaa (x); } int ccccc (const int &p) { return p + 1; } int ddddd (void) { int x; x = 10; return ccccc (x); } Code $ g++ -O1 -fno-inline t.cc -S $ cat t.s _Z5aaaaai: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax incl %eax popl %ebp ret _Z5bbbbbv: pushl %ebp movl %esp, %ebp subl $4, %esp movl $10, (%esp) call _Z5aaaaai leave ret _Z5cccccRKi: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax movl (%eax), %eax incl %eax popl %ebp ret _Z5dddddv: pushl %ebp movl %esp, %ebp subl $20, %esp movl $10, -4(%ebp) leal -4(%ebp), %eax movl %eax, (%esp) call _Z5cccccRKi leave ret C int aaaaa (int p) { return p + 1; } int bbbbb (void) { int x; x = 10; return aaaaa (x); } int ccccc (int* const p) { return *p + 1; } int ddddd (void) { int x; x = 10; return ccccc (&x); } То, что мы тут наблюли, называется Дырявая абстракция. Т.е. пока вы программируете на колхозно-бытовом уровне и у вас стоит задача в виде "запрограммировать действие", вам достаточно жить на абстрактных математических описаниях и не вникать в особенности реализации. Но если вы хотите при всём этом ещё и написать быстро работающую программу, то вам придётся заглядывать вовнутрь абстракции, потому что без реального понимания, как оно всё работает, эффективную программу написать сложно Если скомпилировать тестовый пример с опцией -O3, то начнёт работать inline и все промежуточные обращения в память при работе с указателям будут соптимизированы и код функций bbbbb получится и ddddd одинаково быстрым. Но для этого нужно компилятору возможность делать inline (т.е. чтобы он видел тело вызываемой функции), а потому нужно ещё и программу писать соответствующим образом. Но здесь мы имеем тот же эффект - нам нужно заглядывать вовнутрь абстракции (т.е. понимать, как оно всё устроено изнутри и как работает компилятор), чтобы построить быстро работающий код
1
|
|
| 25.11.2015, 18:27 | ||
|
2) Никаких предупреждений компилятора я не вижу. Вы о чем, собственно? 3) Не надо априори считать других дурней паровоза. Я знаю размеры типов для своей программы и привел минимальный пример, демонстрирующий различия. Получается, что от ваших замечаний, господин ct0r, остался один пшик...
0
|
||
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|
| 25.11.2015, 18:47 | |
|
0
|
|
| 25.11.2015, 18:47 | |
|
Указатели и ссылки [С++]
Ссылки и указатели Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Теория всего 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
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
|