Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.65/40: Рейтинг темы: голосов - 40, средняя оценка - 4.65
NightmareCode
14 / 7 / 0
Регистрация: 20.09.2009
Сообщений: 89
1

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

15.06.2010, 19:35. Просмотров 7251. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2010, 19:35
Ответы с готовыми решениями:

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

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

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

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

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

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

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

Цитата Сообщение от NightmareCode Посмотреть сообщение
Адрес и указатель-вот это одно и тоже.
Это по определению
0
NightmareCode
14 / 7 / 0
Регистрация: 20.09.2009
Сообщений: 89
16.06.2010, 16:08  [ТС] 5
Цитата Сообщение от 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
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
16.06.2010, 16:28 6
Напомню ещё раз, что речь шла о том, что указатель и ссылка на НИЗКОМ УРОВНЕ (т.е. на уровне кода) - одно и то же. Далее. В твоём примере была только одна ссылка - addrwC. При этом в обоих примерах у тебя ссылка выглядела одинаково. Далее у тебя есть objMemory_Basic_Info, которое в одном случае переменная, а вдругом случае - укзатель. В итоге что с чем ты сравнивал, я так и не понял. Одно могу сказать точно: сравнения указателя и ссылки у тебя в примере нет. То, что с точки зрения языка (т.е. верхнего уровня) ссылка и указатель разные вещи - с этим никто не спорит. Но вот выражаются они в один и тот же код

Добавлено через 35 секунд
Кажется понял. В первом примере ты считаешь ссылкой конструкцию "&objMemory_Basic_Info". Это не так. Это операция взятия адреса, а не ссылка
0
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
16.06.2010, 16:34 7
Лучший ответ Сообщение было отмечено как решение

Решение

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

Пример:


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

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

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

На одном из форумов встретил такое определение: Ссылка - это константный разыменованный указатель.
Видимо главная проблема-это разное трактование определения ссылки в книгах!
0
Evg
Эксперт CАвтор FAQ
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
16.06.2010, 23:11 12
Цитата Сообщение от 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
1625 / 1098 / 75
Регистрация: 21.08.2008
Сообщений: 4,619
Записей в блоге: 1
17.06.2010, 00:17 13
Указатель это число - адрес памяти, с которого начинается выделенная под объект область.
Ссылка это альтернативное имя объекта. Т.е. тупо тот же самый объект,но в коде С++ названный по другому.
0
Evg
Эксперт CАвтор FAQ
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
17.06.2010, 09:12 14
Цитата Сообщение от oxotnik Посмотреть сообщение
Ссылка это альтернативное имя объекта
Мы начали спорить о представлении на низком уровне (на уровне машинного кода). На низком уровне ссылка - это тот же самый указатель

Цитата Сообщение от oxotnik Посмотреть сообщение
Т.е. тупо тот же самый объект,но в коде С++ названный по другому
Когда ссылки приходит в виде параметра в процедуру (а в первую очередь для этого ссылки и нужны), то тут гораздо уместнее сравнивать с указателем, чем с объектом-оригиналом (который в данной процедуре попросту недоступен)
0
oxotnik
1625 / 1098 / 75
Регистрация: 21.08.2008
Сообщений: 4,619
Записей в блоге: 1
17.06.2010, 09:37 15
Цитата Сообщение от Evg Посмотреть сообщение
На низком уровне ссылка - это тот же самый указатель
На этом уровне все является указателями (хотя я тут не копенгаген, спорить не буду). И вообще разделение на ссылки и указатели достойно высокого уровня абстракции, а не на уровне машинных кодов.
0
NightmareCode
14 / 7 / 0
Регистрация: 20.09.2009
Сообщений: 89
19.06.2010, 14:54  [ТС] 16
Цитата Сообщение от 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
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
19.06.2010, 16:16 17
Цитата Сообщение от oxotnik Посмотреть сообщение
Указатель это число - адрес памяти, с которого начинается выделенная под объект область.
все-таки указатель - это переменная со своим типом, значение которой - адрес в виртуальной памяти
0
Evg
Эксперт CАвтор FAQ
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
19.06.2010, 16:53 18
Цитата Сообщение от NightmareCode Посмотреть сообщение
Да выходит что на низком уровне ссылка-это по сути константный разыменнованый указатель.
На низком уровне ссылка - это ровно указатель. А вот разыменованный и константный - это уже на высоком уровне (на уровне языка). Т.е. в тексте программы у тебя по сути дела везде присутсвует неявная звёздночка (операция разыменования) - это верхний уровень. При этом низкий уровень (код) не отличаются вообще ничем. Т.е. низкоуровневое представление ссылки полностью эквивалентно представлению указателя
0
AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
19.02.2012, 14:17 19
хотелось бы так же увидеть комментарии по поводу rvalue
0
Миниатюры
Сравнение указателей и ссылок.  
Evg
Эксперт CАвтор FAQ
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
19.02.2012, 15:11 20
Если честно, то вопроса не понял. Конкретно в данном случае ссылка не даёт скорости (ибо эквивалентна указателю). А с чего ты взял, что оно должно увеличить скорость работы? Я так понимаю, что ты где-то что-то прочитал, но не так понял
0
19.02.2012, 15:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2012, 15:11

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

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

Особенности использования указателей и ссылок в C++ при возврате из функции
Пусть у нас есть некий класс CBase и есть функция, которая создает и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru