Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
O_Q
-11 / 2 / 1
Регистрация: 10.04.2016
Сообщений: 53
#1

Используются ли на практике указатели на указатели объектов?

09.07.2016, 08:24. Просмотров 1599. Ответов 67
Метки нет (Все метки)

Имеются ввиду указатели именно на объекты, а не динамические массивы.
Например такой: Object** obj;
А как насчёт такого: Object*** obj;

Если такие приёмы используются, приведите пример, где это целесообразно.
Какие аналоги применяются в таких языках как C#?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2016, 08:24
Ответы с готовыми решениями:

Как на практике используются указатели на члены класса
Вопрос №3. А как на практике используются указатели на члены класса? Они в...

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс...

Через указатели на указатели посчитать сумму двух чисел и записать в третье
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье....

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной
Мой код. #include <iostream> #include <stdlib.h> #include<iomanip>...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов?
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно...

67
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
09.07.2016, 09:01 #2
Цитата Сообщение от O_Q Посмотреть сообщение
Имеются ввиду указатели именно на объекты, а не динамические массивы.
Например такой: Object** obj;
А как насчёт такого: Object*** obj;
Это не указатели на объект. Но вы пишите в утвердительной форме - у вас есть противоположная информация?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,306
Записей в блоге: 5
09.07.2016, 09:27 #3
O_Q, поскольку значение по указателю * в динамической памяти может быть реализованно как массив, то ** это массив массивов, т.е 2d массив. Так почему не быть массиву массивов массивов - 3d массиву?
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,928
09.07.2016, 09:30 #4
Лучший ответ Сообщение было отмечено vxg как решение

Решение

O_Q, указатель на указатель может быть передан в качестве аргумента в функцию которая собирается вернуть в качестве результата указатель на объект и собирается это сделать через аргумент. Тройной звездочке с ходу задачку не придумаю
2
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,306
Записей в блоге: 5
09.07.2016, 09:37 #5
Цитата Сообщение от vxg Посмотреть сообщение
Тройной звездочке с ходу задачку не придумаю
Инициализируем двумерный массив указатель ** в функции передавая его по указателю.
Хотя передача ссылки на указатель проще: T **& ptr_to_T
ps
Цитата Сообщение от O_Q Посмотреть сообщение
Имеются ввиду указатели именно на объекты, а не динамические массивы.
не проснулся ещё. Всё можно удалить.
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,928
09.07.2016, 09:45 #6
IGPIGP, ссылки не есть хорошо это раз, а два это то что тс хочет пример использования без массивов - с массивами все просто - достаточно лишь посчитать звездочки и объявить что это массив такой вот размерности
1
Ferrari F1
791 / 521 / 156
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
09.07.2016, 09:47 #7
Лучший ответ Сообщение было отмечено vxg как решение

Решение

O_Q, например в сортировке массива указателей...
Массив указателей
2
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,306
Записей в блоге: 5
09.07.2016, 09:50 #8
Цитата Сообщение от vxg Посмотреть сообщение
ссылки не есть хорошо это раз
Почему?
Цитата Сообщение от vxg Посмотреть сообщение
, а два это то что тс хочет пример использования без массивов
это я увидел, но позже.
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,928
09.07.2016, 09:55 #9
IGPIGP, потому что если в функцию передается что-то что может быть в ней изменено лучше дать об этом знать всему свету передавая в нее указатель. исключением могут быть лишь функции в которых участвуют потоки (там так исторически заложено) или, может быть, перегрузка некоторых операторов в которой без ссылки получится адское уродство
0
O_Q
-11 / 2 / 1
Регистрация: 10.04.2016
Сообщений: 53
09.07.2016, 10:22  [ТС] #10
Спасибо за ответы.
Может вы работали с языками со сборкой мусора, там такие указатели не доступны в принципе. Как в этом случае можно провести аналогию в решении подобных задач?

Цитата Сообщение от O_Q Посмотреть сообщение
Какие аналоги применяются в таких языках как C# или Java?
На всякий случай опережаю вопрос "что конкретно тебе нужно от этого?": мне сейчас важна не какая-то конкретная задача, а понять принципы использования многоуровневых указателей в С++ и аналогия этих механизмов в Java-подобных языках. Какие задачи этим решаются и решаются ли вообще, возможно придуманы лучшие способы обхода мимо многоуровневых указателей, такие как контейнеры или что-то в этом роде.

Если нужно больше конкретики, поставлю философский вопрос так: если запретить многоуровневые указатели на (!) объекты в С++, какие трудности возникнут и будут ли они критичны. Как без них обходятся Java-подобные языки и какие трудности при этом возникают?
0
Nick Alte
Эксперт С++
1647 / 1019 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
09.07.2016, 10:23 #11
В современном C++ и обычные-то одинарные указатели использовать не следует.
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,928
09.07.2016, 11:20 #12
O_Q, в Ява вы не можете вернуть результат в аргументе если аргумент это не обьект и вы всегда можете модифицировать аргумент внутри функции если он является объектом - просто такой язык - нет опции = другой подход

Добавлено через 26 секунд
Nick Alte, ну ну
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,306
Записей в блоге: 5
09.07.2016, 13:25 #13
Цитата Сообщение от vxg Посмотреть сообщение
IGPIGP, потому что если в функцию передается что-то что может быть в ней изменено лучше дать об этом знать всему свету передавая в нее указатель.
Холиварный момент. Указатель по ссылке это самое то, если говорить про адское.
Цитата Сообщение от O_Q Посмотреть сообщение
там такие указатели не доступны в принципе
Не совсем. Объявить ссылку на ссылку насколько я помню можно (C#). В С++ нельзя. Но в конкретной ситуации связанной с передачей T** чтобы получить изменение T* аналогии нет. В C# например, всё передаётся ссылками, потому что всё - ссылки. Кроме встроенных типов значения и строк, а так же пользовательских структур. Но при передаче типов значения по ссылке ключевые слова ref и out присутствуют лишь в списке параметров/аргументов. Сами переменные объявляются по значению. В сравнении с С++ это ближе к ссылкам. Указатель же в отличие от ссылки нормальный тип в том смысле, что он и объявляется и передаётся одинаково.
1
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,928
09.07.2016, 15:05 #14
IGPIGP, скорее не холивар а лайвхак) среднего ума сопровождающий разработчик быстрее осознаёт что передача в функцию адреса указателя и присвоение значения разыменованию этого адреса внутри функции происходит не спроста. В случае со ссылками его может ждать упс

Добавлено через 57 секунд
По второму - я писал не за шарп а за яву
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,306
Записей в блоге: 5
09.07.2016, 16:13 #15
Цитата Сообщение от vxg Посмотреть сообщение
среднего ума сопровождающий разработчик быстрее осознаёт что передача в функцию адреса указателя и присвоение значения разыменованию этого адреса внутри функции происходит не спроста.
Дык если ему для этого постоянно нужен значок напоминания разыменования, то может это его личное дело? В конце концов, когда нужно избежать копирования, но недопустить модификации, есть возможность объявить формальный параметр константной ссылкой. И если юзер "нечаянно" скастит переменную, чтобы обойти её константность и это будет ненамеренно(!), то это уже не склероз, а болезнь Паркинсона (imho). Или недержание передних конечностей, по крайней мере. В таком разе клиент запросто модифицирует и переданное по указателю (ненамеренно ). А константную ссылку всё-таки, ещё скастить надо, - мороки больше.
Но я согласен с тобой в том, что если предусмотрен возврат nothing (0/NULL/nullptr), то указатель, это выбор истинных джентльменов.
0
ct0r
Игогошка!
1789 / 690 / 44
Регистрация: 19.08.2012
Сообщений: 1,339
Завершенные тесты: 1
09.07.2016, 16:29 #16
Цитата Сообщение от vxg Посмотреть сообщение
потому что если в функцию передается что-то что может быть в ней изменено лучше дать об этом знать всему свету передавая в нее указатель
Это больше смахивает на принцип привыкших к указателям чистых сишников, чем на объективную причину

Цитата Сообщение от IGPIGP Посмотреть сообщение
Но я согласен с тобой в том, что если предусмотрен возврат nothing (0/NULL/nullpnr), то указатель, это выбор истинных джентльменов.
Серьезно? То есть, если функция должна создать объект и вернуть его, или же не возвращать ничего, - то в этом случае мы будем создавать объект в куче и возвращать указатель?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,306
Записей в блоге: 5
09.07.2016, 16:50 #17
Цитата Сообщение от ct0r Посмотреть сообщение
Серьезно?
Вполне.
Цитата Сообщение от ct0r Посмотреть сообщение
То есть, если функция должна создать объект и вернуть его, или же не возвращать ничего, - то в этом случае мы будем создавать объект в куче и возвращать указатель?
Этого не понял. В функцию уже передаётся указатель. По указателю или ссылке. Если по указателю, то можно в случае несоздания отсутствия объекта, записать в указатель nothing. В случае со ссылкой этого сделать нельзя. Я это имел ввиду по крайней мере.
0
ct0r
Игогошка!
1789 / 690 / 44
Регистрация: 19.08.2012
Сообщений: 1,339
Завершенные тесты: 1
09.07.2016, 17:06 #18
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вполне.
Ну вряд ли. Так мы получаем очень серьезный оверхед по производительности, не говоря уже о том, что кое-где выделение памяти крайне не приветствуется (embedded).

Цитата Сообщение от IGPIGP Посмотреть сообщение
В случае со ссылкой этого сделать нельзя.
По-моему никаких проблем, взял и передал std::optional. И выразительнее, и удобнее, и безопаснее, нежели указатель.
http://en.cppreference.com/w/cpp/utility/optional
1
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,928
09.07.2016, 17:42 #19
IGPIGP, ct0r, я лишь объяснил как принято в лучших домах Европы) и тот и другой подход разрешён языком. у каждого мысли свои скакуны
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,306
Записей в блоге: 5
09.07.2016, 19:07 #20
Цитата Сообщение от ct0r Посмотреть сообщение
Так мы получаем очень серьезный оверхед по производительности
В виде проверки указателя на ноль?
Цитата Сообщение от ct0r Посмотреть сообщение
, что кое-где выделение памяти крайне не приветствуется
Вопрос который задан, касается и этой возможности. В нём нет упоминаний о том, что приветствуется, а что нет. Массивы обрезаны только. Но вопрос ведь о сходстве и различиях технологий в языках с GC и без в данном контексте. А там, где есть коллектор, там нет проблем с приветствиями.
Цитата Сообщение от vxg Посмотреть сообщение
у каждого мысли свои скакуны
vxg, и-го-го.
0
09.07.2016, 19:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2016, 19:07

Отсортировать массив и вывести на экран (массивы и указатели на указатели)
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s-...

Указатели на слонов или А зачем нужны указатели?
Знаю что таких вопросов было уйма, но я так и не нашел ответа на свой вопрос....

Написать программу сортировки через указатели на указатели
Вот моя программа #include <iostream> #include <conio.h> #include <string>...


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

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

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