Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/75: Рейтинг темы: голосов - 75, средняя оценка - 4.76
14 / 7 / 0
Регистрация: 20.09.2009
Сообщений: 89

Сравнение указателей и ссылок.

15.06.2010, 19:35. Показов 15986. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Evg Посмотреть сообщение
В си есть указатели. Указатель и ссылка на низком уровне это одно и то же, но на уровне языка - разные вещи
Не совсем так для них компилятор вырабатывает разный ассемблерный код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    //mov dword ptr [dwC], 18h;
    int dwC=24;
    //Передача по ссылке
    //lea eax,[dwC]
    //mov dword ptr [ldwC1],eax
    int *ldwC1 (&dwC);         //значение получено ldwC1[0]-24
    //Присваивание другого указателя
    //mov eax,dword ptr [ldwC1]
    //mov dword ptr [ldwC2],eax
    int *ldwC2=ldwC1;          //значение получено ldwC2[0]-24
    //Присваивание адреса с преобразованием
    //mov eax,dword ptr [dwC] 
        //mov dword ptr [ldwC3],eax 
    int *ldwC3=*(int**)&dwC;   //значение не получено ldwC3[0]-неопределено
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.06.2010, 19:35
Ответы с готовыми решениями:

Касательно указателей и ссылок.
Цитирую фразу из популярной ныне книги Айвора Хортона. "Никогда не возвращайте из функции ссылку на локальную переменную" Так вот....

Использование ссылок и указателей
Добрый вечер Помогите разобраться и понять «Использование ссылок и указателей» Прочел много литературы но понять сложно Объясните...

Совместное использование указателей и ссылок
int *ptr; int &ref = *ptr; ref = 1; Вот и весь вопрос. Ничего плохого в этом нет?

21
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.06.2010, 19:57
Цитата Сообщение от NightmareCode Посмотреть сообщение
Не совсем так для них компилятор вырабатывает разный ассемблерный код
При этом в качестве доказательства приведён код, в котором нет ни одной ссылки. Ну-ну...
0
14 / 7 / 0
Регистрация: 20.09.2009
Сообщений: 89
15.06.2010, 20:07  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
При этом в качестве доказательства приведён код, в котором нет ни одной ссылки. Ну-ну...
Я к тому что ссылка и указатель не всегда одно и тоже на низком уровне.

Адрес и указатель-вот это одно и тоже.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
15.06.2010, 20:32
Цитата Сообщение от NightmareCode Посмотреть сообщение
Я к тому что ссылка и указатель не всегда одно и тоже на низком уровне.
Приведи пример, когда это не одно и то же

Цитата Сообщение от NightmareCode Посмотреть сообщение
Адрес и указатель-вот это одно и тоже.
Это по определению
0
14 / 7 / 0
Регистрация: 20.09.2009
Сообщений: 89
16.06.2010, 16:08  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Приведи пример, когда это не одно и то же
Вот не поленился и привожу пример...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#define  _windows_h_ <windows.h>
#include _windows_h_
 
int main()
{
    int dwC=567;
    //ссылка adrdwC-альтернативное имя dwC
    int &adrdwC=dwC;//adrdwC-не указатель!
    MEMORY_BASIC_INFORMATION objMemory_Basic_Info;
    SIZE_T numberOfBytes=VirtualQuery((LPCVOID)&dwC, &objMemory_Basic_Info, 
 
sizeof(objMemory_Basic_Info));
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define  _windows_h_ <windows.h>
#include _windows_h_
 
int main()
{
    int dwC=567;
    //ссылка adrdwC-альтернативное имя dwC
    int &adrdwC=dwC;//adrdwC-не указатель!
 
    MEMORY_BASIC_INFORMATION* lpMemory_Basic_Info;
    //Будет ошибка так как lpMemory_Basic_Info не инициализирована,
    //даже если указать lpMemory_Basic_Info=NULL, то будет RunTime-ошибка
    SIZE_T numberOfBytes=VirtualQuery((LPCVOID)&dwC, lpMemory_Basic_Info,                           sizeof(MEMORY_BASIC_INFORMATION));
}
Доказательство того что совсем не обязательно ссылка и указатель одно и тоже!
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.06.2010, 16:28
Напомню ещё раз, что речь шла о том, что указатель и ссылка на НИЗКОМ УРОВНЕ (т.е. на уровне кода) - одно и то же. Далее. В твоём примере была только одна ссылка - addrwC. При этом в обоих примерах у тебя ссылка выглядела одинаково. Далее у тебя есть objMemory_Basic_Info, которое в одном случае переменная, а вдругом случае - укзатель. В итоге что с чем ты сравнивал, я так и не понял. Одно могу сказать точно: сравнения указателя и ссылки у тебя в примере нет. То, что с точки зрения языка (т.е. верхнего уровня) ссылка и указатель разные вещи - с этим никто не спорит. Но вот выражаются они в один и тот же код

Добавлено через 35 секунд
Кажется понял. В первом примере ты считаешь ссылкой конструкцию "&objMemory_Basic_Info". Это не так. Это операция взятия адреса, а не ссылка
0
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,306
16.06.2010, 16:34
Лучший ответ Сообщение было отмечено как решение

Решение

На счет разного кода утверждать не буду, но:
C++ ссылки отличаются от указателей несколькими особенностями:
- Невозможно ссылаться напрямую на объект ссылочного типа после его определения; каждое упоминание его имени ссылается напрямую на объект, на который он ссылается.
- В качестве результата первого указания не могут быть выполнены ни какие-либо арифметические вычисления, ни приведение типов, ни любые другие операции, кроме копирования их связанных значений в другие ссылки.
- После создания ссылки ее нельзя переделать в ссылку на другой объект; в таких случаях говорят, не может быть переопределена. Это часто делают с указателями.
- Ссылки не могут быть null (т.е.указывать в никуда), тогда как указатели - могут; каждая ссылка ссылается на некий объект, вне зависимости от его корректности.
- Ссылки не могут быть неинициализированными. Так как невозможно переинициализировать ссылку, она должна быть инициализирована сразу после создания. В частности, локальные и глобальные переменные должны быть проинициализированы там же, где они определены, а ссылки, которые являются данными-членами сущностей класса, должны быть инициализированы в списке инициализатора конструктора класса.

Пример:


int& k; // компилятор выдаст сообщение: ошибка: 'k' declared as reference but not initialized ('k' объявлена как ссылка, но не инициализирована)
3
14 / 7 / 0
Регистрация: 20.09.2009
Сообщений: 89
16.06.2010, 16:38  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Добавлено через 35 секунд
Кажется понял. В первом примере ты считаешь ссылкой конструкцию "&objMemory_Basic_Info". Это не так. Это операция взятия адреса, а не ссылка
Значит книга в которой утверждается, что &-оператор ссылки врет, означающая что следующее за ним идентификатор является именем ссылочного типа
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.06.2010, 16:44
kazak, всё правильно. Вкратце могу подытожить. Указатели - одна из самых опасных конструкций языка Си. А потому раработчики Си++ задумались о некотром подклассе указателей - указатели, которые указывают на конкретный объект. И оформили в виде отдельного типа - ссылка. Основное отличие ссыки от указателя - гарантия того, что любая ссылка всегда указывает на какой-то объект. В отличие от указателя, который можно крутить-вертеть как угодно, что постоянно является источником ошибок. А так ссылка представляет собой тот же самый указатель (хотя синтаксически выглядит немного не так)

Добавлено через 3 минуты
Цитата Сообщение от NightmareCode Посмотреть сообщение
Значит книга в которой утверждается, что &-оператор ссылки врет, означающая что следующее за ним идентификатор является именем ссылочного типа
Оператор & может использоваться в двух случаях: объявление ссылки (хотя условно можно назвать словом "оператор") и операция взятия адреса. По большому счёту это две совершенно разные конструкции и разработчики языка для ссылки могли бы использовать другой символ (например, #), но посчитали, что нужно заиспользовать тот же символ &

C++
1
2
3
int x;
int &y = x; // здесь & означает объявление ссылки
int *yy = &x; // здесь & означает взятие адреса переменной x
На уровне машинного кода y и yy выражается одними и теми же инструкциями процессора
0
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,306
16.06.2010, 16:44
Цитата Сообщение от NightmareCode Посмотреть сообщение
Значит книга в которой утверждается, что &-оператор ссылки врет, означающая что следующее за ним идентификатор является именем ссылочного типа
Это только при объявлении ссылки. В остальных случаях & является операцией взятия адресса.
Цитата Сообщение от Evg Посмотреть сообщение
А так ссылка представляет собой тот же самый указатель (хотя синтаксически выглядит немного не так)
На одном из форумов встретил такое определение: Ссылка - это константный разыменованный указатель.
1
14 / 7 / 0
Регистрация: 20.09.2009
Сообщений: 89
16.06.2010, 16:46  [ТС]
Цитата Сообщение от kazak Посмотреть сообщение
Это только при объявлении ссылки. В остальных случаях & является операцией взятия адреса.

На одном из форумов встретил такое определение: Ссылка - это константный разыменованный указатель.
Видимо главная проблема-это разное трактование определения ссылки в книгах!
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.06.2010, 23:11
Цитата Сообщение от kazak Посмотреть сообщение
Ссылка - это константный разыменованный указатель
Как неформальное определение - это именно оно и есть

Добавлено через 6 часов 24 минуты
Да, вот ещё. Чисто для полноты картины

Код

C++
1
2
3
4
5
6
int x;
const int y;
int &p1 = x;
const int &p2 = y;
 
p1 = p2;
эквивалентно с точки зрения исполнения коду с указателями

C
1
2
3
4
5
6
int x;
const int y;
int * const p1 = &x;
const int * const p2 = &y;
 
*p1 = *p2;
Обе переменные p1 и p2 являются const'ами, т.к. после инициализации их уже нельзя модифицировать. В добавок p2 является указателем на const, т.е. по указателю p2 нельзя записывать
2
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
17.06.2010, 00:17
Указатель это число - адрес памяти, с которого начинается выделенная под объект область.
Ссылка это альтернативное имя объекта. Т.е. тупо тот же самый объект,но в коде С++ названный по другому.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.06.2010, 09:12
Цитата Сообщение от oxotnik Посмотреть сообщение
Ссылка это альтернативное имя объекта
Мы начали спорить о представлении на низком уровне (на уровне машинного кода). На низком уровне ссылка - это тот же самый указатель

Цитата Сообщение от oxotnik Посмотреть сообщение
Т.е. тупо тот же самый объект,но в коде С++ названный по другому
Когда ссылки приходит в виде параметра в процедуру (а в первую очередь для этого ссылки и нужны), то тут гораздо уместнее сравнивать с указателем, чем с объектом-оригиналом (который в данной процедуре попросту недоступен)
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
17.06.2010, 09:37
Цитата Сообщение от Evg Посмотреть сообщение
На низком уровне ссылка - это тот же самый указатель
На этом уровне все является указателями (хотя я тут не копенгаген, спорить не буду). И вообще разделение на ссылки и указатели достойно высокого уровня абстракции, а не на уровне машинных кодов.
0
14 / 7 / 0
Регистрация: 20.09.2009
Сообщений: 89
19.06.2010, 14:54  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Мы начали спорить о представлении на низком уровне (на уровне машинного кода). На низком уровне ссылка - это тот же самый указатель
C++
1
2
3
4
5
6
7
8
        //mov dword ptr [ebp-2A4h],1A59h
    int number=0x1A59;
    //lea eax,[ebp-2A4h]
    //mov dword ptr [ebp-2B0h],eax
    int *pNumber=&number;
    //lea eax,[ebp-2A4h]
    //mov dword ptr [ebp-2BCh],eax 
    int &rt=number;
Да выходит что на низком уровне ссылка-это по сути константный разыменнованый указатель.
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
19.06.2010, 16:16
Цитата Сообщение от oxotnik Посмотреть сообщение
Указатель это число - адрес памяти, с которого начинается выделенная под объект область.
все-таки указатель - это переменная со своим типом, значение которой - адрес в виртуальной памяти
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
19.06.2010, 16:53
Цитата Сообщение от NightmareCode Посмотреть сообщение
Да выходит что на низком уровне ссылка-это по сути константный разыменнованый указатель.
На низком уровне ссылка - это ровно указатель. А вот разыменованный и константный - это уже на высоком уровне (на уровне языка). Т.е. в тексте программы у тебя по сути дела везде присутсвует неявная звёздночка (операция разыменования) - это верхний уровень. При этом низкий уровень (код) не отличаются вообще ничем. Т.е. низкоуровневое представление ссылки полностью эквивалентно представлению указателя
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
19.02.2012, 14:17
хотелось бы так же увидеть комментарии по поводу rvalue
Миниатюры
Сравнение указателей и ссылок.  
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
19.02.2012, 15:11
Если честно, то вопроса не понял. Конкретно в данном случае ссылка не даёт скорости (ибо эквивалентна указателю). А с чего ты взял, что оно должно увеличить скорость работы? Я так понимаю, что ты где-то что-то прочитал, но не так понял
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.02.2012, 15:11
Помогаю со студенческими работами здесь

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

Объясните суть ссылок и указателей в коде
Всем добрый день! В общем, есть код (не судите, что примера попроще я не подобрал, просто подумал, что лучше я спрошу прям на деле),...

Операции присвоения с использованием указателей и ссылок
с помощью указателя pOcenka присвойте соответствующей переменной (o_inf или o_math) значение равное I. При помощи оператора * извлеките на...

Реализация программы с использованием ссылок и указателей
Добрые люди! Подскажите, есть ли тут использованные ссылки и указатели? Препод не принимает лабораторную работу, пока я не реализую...

Демонстрация работы ссылок, указателей или дескрипторов
Нужна помощь. Есть у кого готовый код, который демонстрирует работу указателей, ссылок или дескрипторов? Например сборка мусора ссылаясь на...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru