Ссылки vs указатели - в чем разница?21.11.2015, 20:04. Показов 16754. Ответов 150
Метки нет (Все метки)
Навеяно соседней темой. Не понимаю в чем разница, хотя несколько раз честно пробовал почитать на эту тему, правда без должного внимания и усердия. Зато программировал на ассемблере и чистом С, понимаю абстракцию "адрес ячейки памяти" и "размер типа в байтах", с арифметикой указателей и указателями на указатели сложностей вроде не испытываю
Есть переменная, если она не регистровая - то лежит в какой-то ячейке памяти (или нескольких, зависит от разрядности памяти и структуры типа переменной), адрес этой ячейки (ака указатель) я могу запоминать в другую переменную типа указателя, передавать/возвращать ее из функций, инкрементировать/декрементировать для движения по массиву переменных (если я его предварительно нарезал в той области памяти конечно), разыменовывать и получать/изменять значение. Вроде все. При чем тут термин "ссылки"? А еще оказывается бывают смартпоинтеры, умные указатели и прочие страшные слова
0
|
|
| 21.11.2015, 20:04 | |
|
Ответы с готовыми решениями:
150
в чем разница? массивы и указатели строк |
| 22.11.2015, 00:56 [ТС] | |
|
Пока я ходил на каток, похоже, пропустил много интересного и уже безвозвратно зачищенного
![]() По-хорошему, надо курить ссылку от Nosey. Но на уровне манки-ламера можно наверное сформировать некоторый условно похожий на правду образ семантического эквивалента данных абстракций, не вдаваясь в детали. В конце концов, в одном известном мне языке нет прямого доступа к памяти, более того - он вообще интерпретируемый, но при этом возможно указать вариант передачи параметра в функцию - по значению или по ссылке - с соответствующим предсказуемым поведением.
0
|
|
|
Комп_Оратор)
|
|||
| 22.11.2015, 01:23 | |||
![]() Хотя конечно, если кратко, то ссылка отличается от указателя тем, что она ссылка. Все остальные варианты будут страдать неполнотой, даже если горы книжек перепечатать.
1
|
|||
| 22.11.2015, 01:37 [ТС] | |
|
Пробую собрать зачатки мыслей на уровне манки-кодера, без л-р-х-валью.
Указатели - это про память. Это прямой адрес памяти (реальный/виртуальный - неважно). Что при этом лежит по данному адресу - неизвестно. Вообще-то типизирован, но можно запросто перетипизировать - и прочитать/записать по адресу стартовой ячейки совсем другой тип: например, записали 4 байта инта, потом перетипизировали к чару и прочитали 4 однобайтовых чара по смещению. Море возможностей - море ответственности и вариантов отстрелить ногу. Можно делать указатели на указатели и т.п. и складывать их в любые контейнеры. Является значением первого класса - может передаваться/возвращаться из функций и присваиваться переменным, можно прибавлять/вычитать смещения и получать новые адреса памяти. Ссылки - это про вариант передачи параметров в функцию - и все. Нельзя делать больше ничего. Просто чтобы функция не создавала локальную копию исходного объекта, а ссылалась на него и изменяла если надо. Поэтому больше ничего нельзя - ни вернуть, ни запихнуть в контейнеры, ни записать в переменную. Но и отстрелить ногу тоже возможностей меньше. А фактически за кадром - реализуются как сахар через те же указатели. Много я неправ? Много я упустил?
0
|
|
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||||||||||||||
| 22.11.2015, 01:58 | ||||||||||||||||||
0
|
||||||||||||||||||
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
||||
| 22.11.2015, 02:32 | ||||
|
1
|
||||
|
Комп_Оратор)
|
||||||
| 22.11.2015, 02:55 | ||||||
|
_Ivana, это конечно в основном для передачи в функцию сделано, но если напрячься можно здорово оттянуться. Вот Андрей смотри какой счетчик. Совершенно безопасный. Деревянный можно сказать:
1
|
||||||
| 22.11.2015, 03:07 [ТС] | |
|
IGPIGP, отформатировал для читаемости и разбираю ваш пример. Функция возвращает именно ссылку на свою статическую переменную, и поэтому можно в месте вызова интрементировать ее? Да, этот вариант я не предполагал
0
|
|
|
Комп_Оратор)
|
||||||||||||||
| 22.11.2015, 11:04 | ||||||||||||||
![]() Добавлено через 22 минуты А вот ещё весёлое место. Посмотрим тело функции не глядя в сигнатуру:
![]() И это только кажется.
0
|
||||||||||||||
|
|
|
| 22.11.2015, 12:01 | |
|
На всякий случай. Пример с ссылками и эквивалентный им код с указателями
Сравнение указателей и ссылок. Добавлено через 3 минуты Ссылки и указатели Можно ли для стд::вектор'а взять адрес и-го элемента?
4
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 22.11.2015, 14:14 | |||||||
|
обращение к ссылке, это на самом деле обращение к оригинальному объекту. вам нужно ответить себе на один единственный вопрос: вот есть у вас указатель. чем является реультат разыменовывания указателя?
ответите на этот вопрос, и все встанет на свои места.
2
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 22.11.2015, 14:25 | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 22.11.2015, 14:35 | ||
|
из-за которых неокрепшие умы начинают путать причину и следствие.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 22.11.2015, 14:49 | |||||||
|
что бы упростить материал. на самом деле на практике различие не сильно существенное. ровно до тех пор, пока речь не заходит о концептуальных различиях. я приведу пример. поскольку ссылка - всевдоним оригинального объекта, а все действия над ссылкой - есть действия над оргинальным объектом, то например, взятие размера ссылки - это взятие размера оригинального объекта. и вот здесь мы можем попадать на интересные порадоксы: может ли размер отдельного члена класса быть больше, чем размер всего класса вместе взятого? да не вопрос:
в областях, где важны свойства типов. но для обычного прикладного программиста - разница между ссылкой, и автиоразыменовывающимсчя указателем должна быть не принципиальной.
2
|
|||||||
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|||||||
| 22.11.2015, 14:57 | |||||||
1
|
|||||||
|
Комп_Оратор)
|
|||
| 22.11.2015, 15:06 | |||
|
А для новичков главное понять как работает передача аргументов в параметры-ссылки. Этого вполне достаточно чтобы вдоволь поучиться.
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||
| 22.11.2015, 15:17 | |||||||||||||
|
так ещё и не компилируется. когда вы уже научитесь по человечесчки выкладывать материал? пример: по возможности указываем ссылку на онлайн компилятор, с примером-иллюстрацией http://rextester.com/CKLP43241 далее выкладываем исходный код:
бегать за вами, и подбирать после вас недостающие куски кода - это неуважение к чужому времени. Добавлено через 6 минут более того. на самом деле, ссылка - единственный тип данных на языке с++, который в принципе не обладает квалификатором const. лично я однажды обжегся на этом в метапрограммировании: обычно константными ссылками называют ссылки, которые ссылаются на неизменяемые объекты. но в реальности это - полная фигня. потому что : http://rextester.com/ENTQ87083
1
|
|||||||||||||
| 22.11.2015, 15:17 | |
|
Помогаю со студенческими работами здесь
40
Указатели и ссылки [С++]
Ссылки и указатели Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible". . .
|
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов.
import "math"
func angleClock(hour int, minutes int) float64 {
. . .
|
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
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|