Форум программистов, компьютерный форум CyberForum.ru

Применение указателей - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
22.04.2013, 02:50     Применение указателей #1
Доброй ночи. Встретил вот такое выражение в книге и не могу понять что к чему:
C++
1
Distance& dist = *(new Distance);
После чего можно обращаться к объекту через операцию точки, а не "->".

Disntace - класс. Операция new выделяет место равное объекту класса Distance и возвращает указатель на блок памяти, который выделили мы у операционной системы.
Не могу понять к чему там ссылка (знак амперсанда ) и к чему там операция разыменования. Каким образом оно работает?

Объясните пожалуйста саму схему данного выражения. Обязательно плюсану на спасибо. Благодарю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2013, 02:50     Применение указателей
Посмотрите здесь:

Массив из указателей на масив из указателей на массив из int) C++
применение указателей, структур и объединений C++
применение c++ C++
C++ Применение
C++ Применение итераторов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
22.04.2013, 03:02     Применение указателей #2
Обычное разыменовывание указателя, new выделяет память и возвращает указатель, далее он разыменовывается и получается ссылка на объект Distance, а т.к. -> используется заместо (*...). тут он уже не требуется.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,723
Записей в блоге: 3
22.04.2013, 04:07     Применение указателей #3
IvanInanovich, разыменуя указатель можно получить значение на которое можно сослаться. Однако памятуя, что объект создан динамически его нужно будет потом уничтожить. Так например:
C++
1
2
3
4
Distance& dist = *(new Distance);
//что-то происходит...
Distance *distKiller=&dist;
delete  distKiller;
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.04.2013, 09:16     Применение указателей #4
Цитата Сообщение от IvanInanovich Посмотреть сообщение
Доброй ночи. Встретил вот такое выражение в книге и не могу понять что к чему:
C++
1
Distance& dist = *(new Distance);
После чего можно обращаться к объекту через операцию точки, а не "->".
Disntace - класс. Операция new выделяет место равное объекту класса Distance и возвращает указатель на блок
, который сразу же разыменуется и присваивается ссылке. Выстрел в ногу: динамическая память должна принудительно удаляться оператором delete, а к ссылкам он не применим.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,163
Завершенные тесты: 2
22.04.2013, 09:28     Применение указателей #5
IGPIGP, так тоже сработает
C++
1
2
3
Distance& dist = *(new Distance);
//что-то происходит...
delete&  dist;
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.04.2013, 10:08     Применение указателей #6
Кудаив, Вы главное не спутайте, что & применяется к dist, а не к delete. Хоть такая запись как у Вас тоже будет синтаксически разобрана корректно.
По теме: приведение указателя к ссылке лишь для того, чтобы вместо -> писать . довольно глупая затея.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,163
Завершенные тесты: 2
22.04.2013, 10:11     Применение указателей #7
Tulosba, да я не путаю привычка так писать
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.04.2013, 11:04     Применение указателей #8
Кудаив, как-ибудь напишете
C++
1
a & b
смысл будет вовсе не во взятии адреса
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,163
Завершенные тесты: 2
22.04.2013, 11:15     Применение указателей #9
Tulosba, о нет - только не побитовое и
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.04.2013, 11:23     Применение указателей #10
Кудаив, с чего Вы взяли, что это побитовое И? Это ссылка с именем b на объект типа a
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,163
Завершенные тесты: 2
22.04.2013, 11:41     Применение указателей #11
Tulosba, чтоб понять что это контекста маловато))
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.04.2013, 11:47     Применение указателей #12
Цитата Сообщение от Кудаив Посмотреть сообщение
чтоб понять что это контекста маловато))
Вот поэтому и стоит располагать операторы ближе к той сущности, к которой они должны относиться по замыслу автора.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,723
Записей в блоге: 3
22.04.2013, 12:51     Применение указателей #13
Цитата Сообщение от Кудаив Посмотреть сообщение
IGPIGP, так тоже сработает
Конечно. Операция взятия адреса всё равно предполагает создание временной переменной.
Но понятнее всё же через указатель.
Цитата Сообщение от taras atavin Посмотреть сообщение
Выстрел в ногу: динамическая память должна принудительно удаляться оператором delete, а к ссылкам он не применим.
Дело вкуса. Тут же не только в необходимости разыменования дело. Допустим нужно локально создать ссылку для последующей модификации в функции которая принимает ссылку. Можно конечно в и аргументе написать: &*
но это вряд ли хорошо читать. А потом ещё использовать результат... Так что может кому-то понравится и так как предложено. Мне лично это не нравится.
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
22.04.2013, 14:13  [ТС]     Применение указателей #14
Благодарю ребят за разъяснения.
Хотелось бы уточнить один момент.

Перед инициализации ссылки мы разыминовываем указатель. Для чего это делается? Разыминованый указатель имеет иной адрес?
Т.е. есть адрес объекта номер 1, и есть адрес значения объекта номер 1 (и в данной ситуации мы просто присваиваем ссылку на значение объекта номер 1) или как?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,723
Записей в блоге: 3
22.04.2013, 14:19     Применение указателей #15
Цитата Сообщение от IvanInanovich Посмотреть сообщение
Перед инициализации ссылки мы разыминовываем указатель. Для чего это делается?
Ссылка должна инициализироваться значением в момент создания. То есть код:
C++
1
2
3
4
Distance& dist = *(new Distance);
//что-то происходит...
Distance *distKiller=&dist;
delete  distKiller;
эквивалентен коду:
C++
1
2
3
4
5
Distance *dist_ptr = new Distance;
Distance& distRef = *dist_ptr;//создание ссылки - доп инструкция, но не доп память))
//что-то происходит...
 
delete  dist_ptr;//но тут красивше и не нужно дополнительной
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.04.2013, 14:34     Применение указателей #16
Цитата Сообщение от IGPIGP Посмотреть сообщение
Distance *dist_ptr = new Distance;
Distance& distRef = *dist_ptr;//создание ссылки - доп инструкция, но не доп память))
//что-то происходит...
delete *dist_ptr;//но тут красивше и не нужно дополнительной
А нафига? Лучше, как здесь уже предлагалось, сделать ссылку на сам указатель:
C++
1
2
3
4
Distance *dist_ptr = new Distance;
Distance &*distRef = dist_ptr;//создание ссылки - доп инструкция, но не доп память))
//что-то происходит...
delete *dist_ptr;
.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.04.2013, 14:37     Применение указателей #17
Цитата Сообщение от taras atavin Посмотреть сообщение
Лучше, как здесь уже предлагалось, сделать ссылку на сам указатель
Цитата Сообщение от taras atavin Посмотреть сообщение
А нафига?
Действительно, нафига?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
22.04.2013, 15:13     Применение указателей #18
Цитата Сообщение от Tulosba Посмотреть сообщение
Действительно, нафига?
Ну если ему охота иметь ссылку.
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
22.04.2013, 17:02  [ТС]     Применение указателей #19
Дело тут не в принципиальности)).
До этого, в книге встречались только передачи по ссылке аргументов в функции.
А тут определение идет и инициализация не в сигнатуре функции. В добавок объясняется как мне показалось не очень понятно.

Вот и пытаюсь понять, как оно работает. В книге пишется что на практике такое редко используется.

Ребят, еще раз мы создаем ссылку, в которую ложем разыминованый указатель т.е. прямой доступ к значению переменной?
Ссылка есть ссылка, указатель есть указатель. Не могу понять каким образом ссылка видит и сохраняет в себе разыминованый указатель. Т.е. если бы указатель сохранял ссылку в себе - понятно. А наоборот в добавок операция розыминования - до меня не доходит.
Возможно глупая ситуация, но все же..
И еще раз благодарю что разъясняите.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2013, 17:12     Применение указателей
Еще ссылки по теме:

Применение и удаление указателей C++
C++ Как обойтись без указателей и указателей на указатель?
C++ Применение ООП

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
22.04.2013, 17:12     Применение указателей #20
IvanInanovich, ссылка это всего лишь альтернативное имя переменной. Но в данном случае, переменная не имеет имени, т.к. создается динамически и сразу же разыменовывается.

P.S. Что у Вас с русским языком, IvanInanovich ?
Yandex
Объявления
22.04.2013, 17:12     Применение указателей
Ответ Создать тему
Опции темы

Текущее время: 16:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru