2 / 2 / 0
Регистрация: 15.05.2019
Сообщений: 110
|
||||||
1 | ||||||
Необходимость указателя на указатель03.06.2020, 14:19. Показов 1275. Ответов 15
Метки нет (Все метки)
Добрый день.
Не могу разобраться, подскажите пожалуйста для чего в нижеприведенном методе(занесение узлов в двоичное дерево) используется указатель на указатель. Разве тут нельзя обойтись просто передачей указателя?
0
|
03.06.2020, 14:19 | |
Ответы с готовыми решениями:
15
Сохранить адрес из указателя в другой указатель, а потом первый указатель удалить Передача умного указателя в функцию принимающую указатель на указатель Разыменование указателя на указатель Инкремент указателя на указатель |
18834 / 9836 / 2405
Регистрация: 30.01.2014
Сообщений: 17,273
|
|
03.06.2020, 14:39 | 2 |
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
03.06.2020, 14:41 | 3 |
нельзя.
функция изменяет значение указателя: если бы функция принимала "просто указатель", тогда внутри функции фигурировала бы копия указателя. и функция изменила бы значение копии, а не оригинала. что бы изменить значение оригинального указателя, нормальные люди используют ссылку-на-указатель. аморальные люди используют указатель-на-указатель. твой код писал аморальный человек.
0
|
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
|
|
03.06.2020, 14:42 | 4 |
dm_Consul, если сказать просто: чтобы можно было изменить этот указатель в вызывающем модуле.
0
|
2 / 2 / 0
Регистрация: 15.05.2019
Сообщений: 110
|
|
03.06.2020, 15:00 [ТС] | 5 |
Это из учебника Дейтлов. (Как программировать на с++)
Понятно что передается копия указателя. Но разве она не указывает на тоже значение, и соответственно не меняет его?
0
|
18834 / 9836 / 2405
Регистрация: 30.01.2014
Сообщений: 17,273
|
|
03.06.2020, 15:04 | 6 |
1
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
03.06.2020, 15:11 | 7 | |||||
тебе нужно внимательнее читать аморальный учебник аморальных Дейтлов.
давай поступим так: задача: изменить значение самого указателя, а не того объекта, на который он указывает. рассмотрим простейший пример:
foo , которая на входе получит указатель,и перенацелит его на объект b в консоль должно напечататься значение переменной b если решишь эту задачу, тогда поймёшь зачем нужны ссылки-на-указатели ,ну или указатели-на-указатели , как это сделал аморальный Дейтл.
1
|
172 / 91 / 36
Регистрация: 22.05.2020
Сообщений: 308
|
|||||||||||
03.06.2020, 15:41 | 8 | ||||||||||
Кстати, в чём преимущество функции
0
|
2 / 2 / 0
Регистрация: 15.05.2019
Сообщений: 110
|
|
03.06.2020, 15:45 [ТС] | 9 |
0
|
Вездепух
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
|
|
03.06.2020, 17:28 | 10 |
Можно было поступить и так. Однако в таком варианте при реализации рекурсивной
insertNodeHelper нам бы пришлось присваивать результат работы функции на каждом уровне рекурсии. А это расточительно, ибо фактическое изменение указателя происходит только на самом нижнем уровне.
0
|
Вездепух
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
|
|
03.06.2020, 18:12 | 12 |
Вот именно передача указателя на указатель (или ссылки на указатель) через параметры - это, возможно, и есть попытка сделать "не расточительно".
То есть таким способом, вместо выполнения безусловного присваивания на каждом уровне рекурсии, автор делает "отложенное присваивание": левая часть присваивания передается "по ссылке" и физическое присваивание делается только в тот момент, когда оно действительно нужно. В данном примере - один раз по достижении листа дерева. В рамках данной задачи овчинка может не стоить выделки, а вот в случае более тяжелых объектов - это стандартный паттерн.
1
|
172 / 91 / 36
Регистрация: 22.05.2020
Сообщений: 308
|
|
04.06.2020, 00:48 | 13 |
TheCalligrapher, однако, если в случае возврата значения из указателя у компилятора есть возможность соптимизировать и вернуть значение в регистре, то при необходимости записать значение в память, её-таки придётся записать, а это не всегда быстро.
0
|
Вездепух
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
|
||||||||||||||||
04.06.2020, 06:19 | 14 | |||||||||||||||
В моем сообщении №10 речь идет о том, что если данную рекурсивную функцию переделать на
То есть в этом случае запись в память тоже есть. Причем не просто "есть", а есть во множественном (и избыточном!) количестве. Если вы можете предложить способ организации рекурсивных вызовов для
0
|
172 / 91 / 36
Регистрация: 22.05.2020
Сообщений: 308
|
|
04.06.2020, 10:34 | 15 |
Вариантов может быть несколько. Например такой:
1. Возвращаем указатель на новый объект, если он создан через new. В противном случае возвращаем nullptr. 2. В вызывающем проверяем указатель, и если он не равен nullptr, сохраняем "в памяти".
0
|
Вездепух
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,053
|
|
04.06.2020, 10:49 | 16 |
Это создает дополнительно ветвление для проверки на nullptr, что тоже требует затрат производительности.
Смотрим ваше исходное замечание Но "запись в память" там делается только один раз: в самом листовом узле дерева, при создании нового узла. То есть запись в память там делается ровно и только в том случае, что и в предлагаемом вами варианте. Но в предлагаемом вами варианте нужно дополнительное ветвление в вызывающем коде, а в исходном варианте все ветвления уже и так сделаны и дополнительного ветвления не нужно.
0
|
04.06.2020, 10:49 | |
04.06.2020, 10:49 | |
Помогаю со студенческими работами здесь
16
Передача в функцию указателя на указатель Передача указателя на указатель в функцию вызов метода у указателя на указатель на класс Указатель на объект из указателя на член класса Сохранение/Загрузка указателя на указатель типа char Передача в функцию указателя на указатель на одномерный массив Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |