15 / 13 / 4
Регистрация: 16.08.2018
Сообщений: 125
|
|
1 | |
Указатели на указатели: для чего они могут понадобятся?18.08.2018, 03:47. Показов 3705. Ответов 47
Метки нет (Все метки)
Изучаю C++, дошёл до указателей на указатели.
Там пишут что эта тема не обязательна. Для чего они могут понадобятся?
0
|
18.08.2018, 03:47 | |
Ответы с готовыми решениями:
47
Для чего нужны указатели? Для чего нужны указатели на функции? Указатели и указатели на указатели, а также типы данных Ссылки и указатели, для чего нужны те и другие? |
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313
|
||||||
18.08.2018, 04:58 | 2 | |||||
Указатель играет двойную роль в языках.
Массив на стеке неявно кастуется к указателю на первый элемент массива. Классически память как в C, так и в C++ выделяется, возвращая указатель на выделенный блок (в лучшем случае). Указатель на указатель чаще считают интерфейсом для управление матрицей, ассоциируя имя такого указателя с адресом начала массива указателей, которые, в свою очередь, хранят адреса уже "привычных для работы" массивов. К реальности это много как применимо. Например, хочешь ты создать островок в воздухе. Ты можешь описать расположение элементарных объектов на этом островке (обычных квадратов, если упрощать). Но квадрат без дополнительных ухищрений не сможет содержать больше информации. Например, нельзя будет построить дом из квадратов - это уже третье измерение. Третье измерение можно описать как массив матриц - слоёв, а интерфейс - это (лень писать словами):
int* и int[] . Допиши больше звёздочек и скобочек - станет интереснее. Как насчёт четвёртого измерения - времени? Просто создаёшь четвёртое измерение как массив, элементами которого уже будут являться конкретные позиции объектов в заданный промежуток времени. Массивы большей размерности? Пожалуйста! При моделировании реального мира нужно учитывать не только позиции объектов. Как насчёт их скоростей и ускорений? Просто добавляешь ещё два измерения. Нужно больше информации на одну точку пространства? Просто добавь больше измерений! Секрет
Стека не хватит. Привет, куча.
3
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||||
18.08.2018, 05:29 | 3 | |||||
Итераторы для массива указателей. Да, можно в принципе и индексы использовать, но STL алгоритмы хотят именно итераторы.
0
|
Модератор
13727 / 10923 / 6479
Регистрация: 18.12.2011
Сообщений: 29,156
|
||||||||||||||||||||||||||
18.08.2018, 08:29 | 4 | |||||||||||||||||||||||||
Сообщение было отмечено kcalbCube как решение
Решение
Мне кажется от предыдущих сообщений kcalbCube совсем запутался.
Объявим переменную
Теперь выделим память для каждой строки
У нас сформировалась матрица, к которой можно обращаться как к двумерному массиву:
0
|
"C with Classes"
|
||||||
18.08.2018, 08:55 | 5 | |||||
0
|
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
|
|
18.08.2018, 09:25 | 6 |
ТС, просто поймите, что указатель указывает на какой-то участок памяти и сам занимает ещё какой-то.
Соответственно, указатель может указывать и на участок памяти, который занят другим указателем. И даже может указывать на свой собственный участок.
0
|
41 / 41 / 11
Регистрация: 02.04.2016
Сообщений: 313
|
||||||
18.08.2018, 16:33 | 7 | |||||
Без понимания базовых типов языка и того, что с ними можно делать,
в "реальности" можно ощущать дискомфорт от незнания, скажем так. Конечно, это субъективное мнение. Был у меня один монстр... Давным-давно... Попробуй понять и даже реализовать его Кликните здесь для просмотра всего текста
0
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
||||||
18.08.2018, 18:29 | 8 | |||||
Например для создания массива указателей.
Попробуем создать массив int-ов:
Не обязательна для чего? Если собираетесь писать программы уровня hello world, тогда не обязательно. А так... не представляю себе хорошего программиста на С++ который не знает что такое указатель на указатель
0
|
Модератор
|
|||||||||||
18.08.2018, 19:06 | 9 | ||||||||||
kcalbCube, представьте себе дорожный знак. На нём надпись "Через 100 метров на перекрёстке улиц Солнечная и Гагарина - отель".
Дорожный знак - это вполне конкретный объект. Тип этого объекта - указатель на отель .Значение, которое хранит указатель - адрес (надпись на дорожном знаке - адрес отеля). Давайте выразим это в коде:
Примечание:
Ещё очень хорошо концепцию указателей на указатели и уровни косвенности можно представить, вспомнив старую дурацкую школьную шутку, из тех, что пишут на стенах туалетов:
3
|
Комп_Оратор)
|
||||||
19.08.2018, 12:15 | 11 | |||||
Боюсь, тут мало толку будет. Мне никогла не помогало. А в данной теме, вопрос достаточно прост и глубок. Вот у тебя уже есть слон, но зачем ещё одного покупать? То есть, опять-таки:
Допустим, есть такой адрес. Но зачем же тогда ещё одна переменная хранящая адрес адреса? Я ещё не имею, такого опыта как у Вас Kastaneda, - даже и близко. Но я понял, что указатель, это первое знакомство с косвенным обращением в частности и уровнем косвенности, вообще. А далее, по жизни, на каждом новом уровне я постоянно убеждаюсь, что искусство состоит в оптимальном распределении косвенности. kcalbCube, среди аргументов функции main есть такой набор строк:
0
|
sourcerer
|
19.08.2018, 12:19
#12
|
0
|
IGPIGP
|
19.08.2018, 12:28
#13
|
0
|
2712 / 866 / 327
Регистрация: 10.02.2018
Сообщений: 2,047
|
|
19.08.2018, 12:50 | 14 |
Пример, сделать функцию, которая выделяет память и возвращает указатель на эту память через свои аргументы.
Кликните здесь для просмотра всего текста
Рассмотрим функцию, её аргументы и переменную.
1) Мы можем передать в функцию значение нашей переменной. При этом функция может что угодно делать со значением, но не сможет изменить саму переменную. Когда программа вернётся из функции значение переменной останется тем же, что было до вызова. 2) Мы можем передать в функцию указатель на переменную. При этом функция уже может изменять значение переменной. То есть, когда программа вернётся из функции значение переменной может быть отличным от значения до вызова. 3) А теперь представим, что наша переменная сама по себе является указателем. При этом всё описанное раньше будет справедливо и для неё. Если нам не требуется изменений нашей переменной, то в функцию мы будем передавать её значение (указатель). Если же нам нужно, что бы функция изменяла переменную, то мы будем передавать в неё указатель на переменную (указатель на указатель).
1
|
1682 / 1095 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
|
|
19.08.2018, 13:15 | 15 |
Человек задал логичный вопрос. Где на практике это все нужно?!
Это все и так понятно, можно хоть указатели создавать, хоть указатели на указатели, хоть указатели на указатели на указатели. Вопрос ТС в другом. Где это действительно будет нужно в реальной жизни? Ведь глупо создавать указатели просто так, для прикола. Выше уже были хорошие примеры - создать матрицу, изменить указатель в функции. Но 1) В С++ есть вектора(используя которые можно вообще не думать о выделении памяти), велосипедить свою матрицу на указателях смысла нет(разве только в образовательных целях) 2) С++ не Си, если нужно менять в функции указатель проще передавать его по ссылке Возможно я не совсем прав, но мне кажется в реальном коде указатели на указатели это редкий зверь.
0
|
2712 / 866 / 327
Регистрация: 10.02.2018
Сообщений: 2,047
|
|
19.08.2018, 13:20 | 16 |
Возможно и редкий, но встречается. Последний аргумент CoCreateInstance.
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
19.08.2018, 13:28 | 17 |
1
|
510 / 272 / 60
Регистрация: 14.12.2010
Сообщений: 548
|
||||||
19.08.2018, 18:56 | 18 | |||||
1
|
5 / 5 / 1
Регистрация: 20.07.2018
Сообщений: 24
|
|
19.08.2018, 20:04 | 19 |
Можно попробовать ассоциировать указатель с массивом,тогда думая об указателе на указатель можно будет быстрее сообразить,что это массив массивов ( ну или двумерный массив ).
А вообще,когда дело подходит к реальной практике, благодаря контексту, всё становиться ясно.Если же код становиться чересчур тяжелым, скорее всего его упростят или уже упростили. (К примеру массив объектов типа string , куда проще,чем char** или char* [] )
0
|
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|
20.08.2018, 03:39 | 20 |
Можно рассмотреть более общее понятие - когда указатель указывает на структуру, содержащий указатель на такую же структуру, который в свою очередь указывает на (цикл повторяется). Всё это называется списком и достаточно широко используется. Если в структуре два указателя, указывающие аналогичным образом, то это называется бинарным деревом и тоже очень широко используется.
А просто указатель на указатель - для модификации самого указателя (т.е. адреса, содержащегося в указателе) внутри функции (в реализациях функций работы со списком может понадобиться) или для динамических многомерных массивов.
0
|
20.08.2018, 03:39 | |
20.08.2018, 03:39 | |
Помогаю со студенческими работами здесь
20
Понимание для чего вообще нужны указатели? Для чего нужны и зачем использовать smart-указатели? Для чего могут на мой сайт на VPS делаться следующие запросы и что они означают? Тема указатели, зачем они нужны Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Как запретить подсветку выделенного текста с помощью CSS
InfoMaster 20.01.2025
Подсветка текста при выделении является стандартным поведением браузера, которое не всегда соответствует дизайнерским решениям или функциональным требованиям веб-приложения.
Выделение текста может. . .
|
Как выполнить другую программу или системную команду из Python
InfoMaster 20.01.2025
Python предоставляет мощные инструменты для выполнения системных команд и управления внешними процессами, что делает его идеальным выбором для автоматизации различных задач системного. . .
|
Как узнать директорию bash-скрипта из самого bash-скрипта
InfoMaster 20.01.2025
При разработке bash-скриптов одной из важных задач является определение директории, в которой находится исполняемый скрипт. Это критически важно для корректной работы с файлами, загрузки конфигураций. . .
|
В чем разница между let и var в JavaScript
InfoMaster 20.01.2025
JavaScript прошел длинный путь эволюции с момента своего создания в 1995 году. Одним из важнейших аспектов развития языка стало совершенствование механизмов объявления и управления переменными. . . .
|
Эффективная работа со строками в Go
InfoMaster 20.01.2025
Язык программирования Go предлагает уникальный подход к работе со строками, который существенно отличается от многих других языков программирования. В Go строки представляют собой неизменяемые. . .
|
Как проверить, что отображение (map) содержит ключ в Go
InfoMaster 20.01.2025
Отображения (maps) в языке программирования Go представляют собой мощные структуры данных, которые позволяют хранить пары ключ-значение и обеспечивают быстрый доступ к данным по уникальным. . .
|
Как организовать домашнее хранилище фильмов с общим доступом для всей семьи
InfoMaster 20.01.2025
Преимущества домашнего медиасервера
В современном мире, где цифровой контент стал неотъемлемой частью нашей жизни, организация домашнего медиасервера становится все более актуальной задачей. . . .
|
Перспективы развития жестких дисков: есть ли у них будущее?
InfoMaster 20.01.2025
История и эволюция жестких дисков
История развития жестких дисков начинается в 1956 году, когда компания IBM представила первое устройство для хранения данных на магнитных пластинах - IBM 350. . .
|
Распознавание изображений (компьютерное зрение) на C++
InfoMaster 20.01.2025
Введение в компьютерное зрение и основы работы с изображениями
Компьютерное зрение представляет собой одну из наиболее динамично развивающихся областей информационных технологий, позволяющую. . .
|
Какой язык программирования лучший для разработки нейронных сетей
InfoMaster 20.01.2025
В современном мире технологий искусственные нейронные сети становятся неотъемлемой частью множества инновационных решений, от распознавания речи до автоматического управления транспортными. . .
|
Как подключить JavaScript файл в другом JavaScript файле
InfoMaster 20.01.2025
В современной веб-разработке организация кодовой базы играет ключевую роль в создании масштабируемых и поддерживаемых приложений. Модульность и правильное структурирование кода стали неотъемлемыми. . .
|
Как откатить изменения в исходниках, не внесенные в Git
InfoMaster 20.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с необходимостью отменить внесенные изменения в исходном коде. Особенно актуальной становится ситуация, когда изменения еще. . .
|