0 / 0 / 2
Регистрация: 03.01.2013
Сообщений: 113
1

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

22.04.2013, 02:50. Показов 2696. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброй ночи. Встретил вот такое выражение в книге и не могу понять что к чему:
C++
1
Distance& dist = *(new Distance);
После чего можно обращаться к объекту через операцию точки, а не "->".

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

Объясните пожалуйста саму схему данного выражения. Обязательно плюсану на спасибо. Благодарю.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2013, 02:50
Ответы с готовыми решениями:

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

Применение и удаление указателей
Здравствуйте. Я не могу понять сути,когда нам нужно удалить указатель для освобождения памяти....

Применение указателей, структур и объединений
Здравствуйте, люди добрые!! (^_^)/ Очень нуждаюсь в вашей помощи... Помогите разобраться...

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

21
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
22.04.2013, 03:02 2
Обычное разыменовывание указателя, new выделяет память и возвращает указатель, далее он разыменовывается и получается ссылка на объект Distance, а т.к. -> используется заместо (*...). тут он уже не требуется.
2
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
22.04.2013, 04:07 3
IvanInanovich, разыменуя указатель можно получить значение на которое можно сослаться. Однако памятуя, что объект создан динамически его нужно будет потом уничтожить. Так например:
C++
1
2
3
4
Distance& dist = *(new Distance);
//что-то происходит...
Distance *distKiller=&dist;
delete  distKiller;
1
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
22.04.2013, 09:16 4
Цитата Сообщение от IvanInanovich Посмотреть сообщение
Доброй ночи. Встретил вот такое выражение в книге и не могу понять что к чему:
C++
1
Distance& dist = *(new Distance);
После чего можно обращаться к объекту через операцию точки, а не "->".
Disntace - класс. Операция new выделяет место равное объекту класса Distance и возвращает указатель на блок
, который сразу же разыменуется и присваивается ссылке. Выстрел в ногу: динамическая память должна принудительно удаляться оператором delete, а к ссылкам он не применим.
2
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
22.04.2013, 09:28 5
IGPIGP, так тоже сработает
C++
1
2
3
Distance& dist = *(new Distance);
//что-то происходит...
delete&  dist;
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.04.2013, 10:08 6
Кудаив, Вы главное не спутайте, что & применяется к dist, а не к delete. Хоть такая запись как у Вас тоже будет синтаксически разобрана корректно.
По теме: приведение указателя к ссылке лишь для того, чтобы вместо -> писать . довольно глупая затея.
1
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
22.04.2013, 10:11 7
Tulosba, да я не путаю привычка так писать
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.04.2013, 11:04 8
Кудаив, как-ибудь напишете
C++
1
a & b
смысл будет вовсе не во взятии адреса
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
22.04.2013, 11:15 9
Tulosba, о нет - только не побитовое и
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.04.2013, 11:23 10
Кудаив, с чего Вы взяли, что это побитовое И? Это ссылка с именем b на объект типа a
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
22.04.2013, 11:41 11
Tulosba, чтоб понять что это контекста маловато))
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.04.2013, 11:47 12
Цитата Сообщение от Кудаив Посмотреть сообщение
чтоб понять что это контекста маловато))
Вот поэтому и стоит располагать операторы ближе к той сущности, к которой они должны относиться по замыслу автора.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
22.04.2013, 12:51 13
Цитата Сообщение от Кудаив Посмотреть сообщение
IGPIGP, так тоже сработает
Конечно. Операция взятия адреса всё равно предполагает создание временной переменной.
Но понятнее всё же через указатель.
Цитата Сообщение от taras atavin Посмотреть сообщение
Выстрел в ногу: динамическая память должна принудительно удаляться оператором delete, а к ссылкам он не применим.
Дело вкуса. Тут же не только в необходимости разыменования дело. Допустим нужно локально создать ссылку для последующей модификации в функции которая принимает ссылку. Можно конечно в и аргументе написать: &*
но это вряд ли хорошо читать. А потом ещё использовать результат... Так что может кому-то понравится и так как предложено. Мне лично это не нравится.
0
0 / 0 / 2
Регистрация: 03.01.2013
Сообщений: 113
22.04.2013, 14:13  [ТС] 14
Благодарю ребят за разъяснения.
Хотелось бы уточнить один момент.

Перед инициализации ссылки мы разыминовываем указатель. Для чего это делается? Разыминованый указатель имеет иной адрес?
Т.е. есть адрес объекта номер 1, и есть адрес значения объекта номер 1 (и в данной ситуации мы просто присваиваем ссылку на значение объекта номер 1) или как?
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
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;//но тут красивше и не нужно дополнительной
1
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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;
.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.04.2013, 14:37 17
Цитата Сообщение от taras atavin Посмотреть сообщение
Лучше, как здесь уже предлагалось, сделать ссылку на сам указатель
Цитата Сообщение от taras atavin Посмотреть сообщение
А нафига?
Действительно, нафига?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
22.04.2013, 15:13 18
Цитата Сообщение от Tulosba Посмотреть сообщение
Действительно, нафига?
Ну если ему охота иметь ссылку.
0
0 / 0 / 2
Регистрация: 03.01.2013
Сообщений: 113
22.04.2013, 17:02  [ТС] 19
Дело тут не в принципиальности)).
До этого, в книге встречались только передачи по ссылке аргументов в функции.
А тут определение идет и инициализация не в сигнатуре функции. В добавок объясняется как мне показалось не очень понятно.

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

Ребят, еще раз мы создаем ссылку, в которую ложем разыминованый указатель т.е. прямой доступ к значению переменной?
Ссылка есть ссылка, указатель есть указатель. Не могу понять каким образом ссылка видит и сохраняет в себе разыминованый указатель. Т.е. если бы указатель сохранял ссылку в себе - понятно. А наоборот в добавок операция розыминования - до меня не доходит.
Возможно глупая ситуация, но все же..
И еще раз благодарю что разъясняите.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.04.2013, 17:12 20
IvanInanovich, ссылка это всего лишь альтернативное имя переменной. Но в данном случае, переменная не имеет имени, т.к. создается динамически и сразу же разыменовывается.

P.S. Что у Вас с русским языком, IvanInanovich ?
0
22.04.2013, 17:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2013, 17:12
Помогаю со студенческими работами здесь

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си)
Уважаемые программисты, возникло несколько вопросов касательно указателей. Почему при выводе...

Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей
Нужно создать специализацию для шаблона, которая принимает массив указателей на строки и количество...

Различия указателей char* от указателей других типов
Помогите пожалуйста разобраться! Прочитал раздел про указатели и даже вроде бы понял. Что...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru