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

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

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

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

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

Объясните пожалуйста саму схему данного выражения. Обязательно плюсану на спасибо. Благодарю.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.04.2013, 02:50
Ответы с готовыми решениями:

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

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

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

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

Перед инициализации ссылки мы разыминовываем указатель. Для чего это делается? Разыминованый указатель имеет иной адрес?
Т.е. есть адрес объекта номер 1, и есть адрес значения объекта номер 1 (и в данной ситуации мы просто присваиваем ссылку на значение объекта номер 1) или как?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.04.2013, 14:19
Цитата Сообщение от 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
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
22.04.2013, 14:34
Цитата Сообщение от 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
Цитата Сообщение от taras atavin Посмотреть сообщение
Лучше, как здесь уже предлагалось, сделать ссылку на сам указатель
Цитата Сообщение от taras atavin Посмотреть сообщение
А нафига?
Действительно, нафига?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
22.04.2013, 15:13
Цитата Сообщение от Tulosba Посмотреть сообщение
Действительно, нафига?
Ну если ему охота иметь ссылку.
0
0 / 0 / 2
Регистрация: 03.01.2013
Сообщений: 113
22.04.2013, 17:02  [ТС]
Дело тут не в принципиальности)).
До этого, в книге встречались только передачи по ссылке аргументов в функции.
А тут определение идет и инициализация не в сигнатуре функции. В добавок объясняется как мне показалось не очень понятно.

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

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

P.S. Что у Вас с русским языком, IvanInanovich ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.04.2013, 17:12
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод Сайт называется reddit: The Thinkpad X220 Tablet is the best budget school laptop period. Это. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru