Ссылки vs указатели - в чем разница?21.11.2015, 20:04. Показов 16736. Ответов 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 | |
|
Помогаю со студенческими работами здесь
60
Указатели и ссылки [С++]
Ссылки и указатели Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|