|
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
|
||||||
Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей?17.10.2018, 20:59. Показов 1944. Ответов 25
Метки нет (Все метки)
Доброго времени суток!
Задался теоретическим вопросом. Читал пример из книги Лафоре ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++, код persort.cpp// сортировка объектов через массив указателей на них. Рассматривается массив указателей на объекты. Автор пишет, что быстрее рассортировать в массиве сами указатели через указатели на них, потому что "Таким образом мы исключаем необходимость перемещения объектов в памяти, которое отнимает много времени, если объекты очень большие" . То есть идёт работа с указателями на указатели. Я не понимаю, почему нельзя просто менять значения адресов, которые хранятся в указателях, одно значение записывать в один указатель, а его первоначальное значение- в другой. Ключевым ведь является то, что если я поменяю в указателе значение - адрес объекта, это же не значит что тот объект, на который данный указатель указывал, переместиться на этот этот новый адрес (как процитировано выше), правильно ? Или я чего-то не понимаю? Код из книги ниже, но зачем же усложнять указателями на указатели?
0
|
||||||
| 17.10.2018, 20:59 | |
|
Ответы с готовыми решениями:
25
Массивы указателей и указатели на указатели Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? Указатели, почему выводится строка вместо символа? |
|
0 / 1 / 0
Регистрация: 12.10.2018
Сообщений: 10
|
|||||||||||
| 17.10.2018, 21:38 | |||||||||||
|
Попробую объяснить, хотя я не опытный. Вы хотите заменить тип person ** на person*.
Тут надо хорошо понимать указатели. Проблема в том, что в функцию указатели передаются по значению(её копии). То есть, если вы сделаете вот так:
0
|
|||||||||||
|
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
|
|
| 17.10.2018, 21:44 [ТС] | |
|
alexbez, то есть смысл в том, чтобы во время сортировки задействовать меньше памяти, не создавая копии?
А если всё же , даже если, использовать копии, как в первом коде, объекты будут перемещаться в памяти, как пишет Лафоре? я так понимаю, что нет.
0
|
|
|
0 / 1 / 0
Регистрация: 12.10.2018
Сообщений: 10
|
|
| 17.10.2018, 21:57 | |
|
Fatmarmelad, возможно я поторопился с ответом. Увидел дату вашей регистрации, после того как написал ответ. Я думал это вопрос от новичка. Наверно я что-то не то написал. Извините.
0
|
|
|
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
|
|
| 17.10.2018, 23:24 [ТС] | |
|
alexbez, я и есть новичок. С++ учу в свободное время. Поэтому и спрашиваю. Меня заинтересовало, почему Лафоре пишет про перемещение объектов в памяти.
0
|
|
|
1357 / 856 / 365
Регистрация: 26.02.2015
Сообщений: 3,814
|
|
| 17.10.2018, 23:27 | |
|
Fatmarmelad, ну, так а ты попробовал запустить программу без указателей на указатели?
Добавлено через 33 секунды
0
|
|
|
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
|
|
| 17.10.2018, 23:40 | |
|
Fatmarmelad, все довольно просто. В случае обычной сортировки имеется массив элементов типа
T=person. Указатель на элемент этого массива будет иметь тип T *=person *. В твоем же случае у тебя массив элементов типа T=person *. Тогда указатель на элемент этого массива будет иметь тип T *=person **. Вот отсюда и берется двойной указатель.Вся суть подхода в том, чтобы избежать дорогостоящего копирования элементов массива. Обмен местами двух элементов типа T=person может занимать на порядок больше времени, чем обмен двух элементов типа T=person *.
0
|
|
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|||||||||||||||||
| 18.10.2018, 01:43 | |||||||||||||||||
|
alexbez, вы верно в целом все описали.
Возьмите и замените тип указателя на обычный int.
Fatmarmelad, Единственное, что здесь нужно знать про указатели, что int * - это такой тип.Вы, если не понимаете как это так, пишите функцию с условным T (как вам выше объяснили), а потом меняйте T на тот тип, который нужен. Вот общая функция обмена местами значений двух переменных:
T подставите int (т.е. таким образом нас интересует обмен значений двух переменных типа int), то получите первую функцию из моего примера.Если подставите вместо T тип int * (т.е. таким образом нас интересует обмен значений двух переменных типа указатель на int), то получите функцию из второго примера, и примерно тоже самое, что было дано в книге.
0
|
|||||||||||||||||
|
Just Do It!
|
||
| 18.10.2018, 08:34 | ||
|
Почему? Представьте что у вас есть фильмотека из 1000 фильмов и вы решили упорядочить их по году выхода. Вы предпочтете физически разложить их в своем каталоге по выбранному критерию или все же предпочтете составить таблицу указателей на эти файлы?
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 18.10.2018, 12:48 | |
|
0
|
|
|
Заблокирован
|
|
| 18.10.2018, 14:40 | |
|
0
|
|
|
34 / 10 / 2
Регистрация: 20.02.2016
Сообщений: 1,613
|
|||||||||||
| 18.10.2018, 21:23 [ТС] | |||||||||||
|
Я задался этой темой из-за слов, которые привёл выше
"Таким образом мы исключаем необходимость перемещения объектов в памяти, которое отнимает много времени, если объекты очень большие" . Сейчас я понимаю, что массив объектов в функции это Class*, а массив указателей на них Class**. Иначе записать нельзя.
Вдогонку. Насколько я сейчас понимаю, невозможно поменять значения адресов элементов массива, потому что они -константы. Прав ли я? То есть код ниже невозможен.
0
|
|||||||||||
|
Just Do It!
|
||||||||
| 19.10.2018, 01:06 | ||||||||
Представь ячейку памяти в своем компе, которая что-то хранит. У неё есть номер. Он же и адрес.
0
|
||||||||
|
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
|
|
| 19.10.2018, 10:47 | |
|
В том, что передается массив указателей, а не указатель на указатель. Такая запись может служить подсказкой программисту.
1
|
|
|
4079 / 2677 / 432
Регистрация: 09.09.2017
Сообщений: 11,888
|
||
| 19.10.2018, 11:11 | ||
|
Croessmah, хорошо, давайте я повторю ключевую фразу:
0
|
||
|
"C with Classes"
|
|
| 19.10.2018, 11:18 | |
|
0
|
|
|
Неэпический
|
|
| 19.10.2018, 11:20 | |
|
COKPOWEHEU,
Во-первых, такая запись сама по себе воспринимается сложнее. Во-вторых, такая запись всё равно не дает никаких гарантий. В-третьих, слабо верится, что разработчику функции нужна эта подсказка, а для пользователя она всё равно недостаточна, нужно лезть в документацию. В-четвертых, удобство такой подсказки - это как выбор цвета шапки, кому-то нравится, кому-то нет. Лично я из второй категории и считаю такую запись говеной. Добавлено через 17 секунд _stanislav, молодец
0
|
|
|
Just Do It!
|
|
| 19.10.2018, 11:23 | |
|
0
|
|
| 19.10.2018, 11:23 | |
|
Помогаю со студенческими работами здесь
20
Указатели и указатели на указатели, а также типы данных Указатели. Важность указателей
Инициализация массива указателей на указатели Указатели. Сравнение двух указателей и их sizeof() Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|