15 / 13 / 4
Регистрация: 16.08.2018
Сообщений: 125
|
|
1 | |
Указатели на указатели: для чего они могут понадобятся?18.08.2018, 03:47. Показов 3632. Ответов 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
|
Модератор
13688 / 10894 / 6469
Регистрация: 18.12.2011
Сообщений: 29,076
|
||||||||||||||||||||||||||
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
|
2708 / 862 / 326
Регистрация: 10.02.2018
Сообщений: 2,042
|
|
19.08.2018, 12:50 | 14 |
Пример, сделать функцию, которая выделяет память и возвращает указатель на эту память через свои аргументы.
Кликните здесь для просмотра всего текста
Рассмотрим функцию, её аргументы и переменную.
1) Мы можем передать в функцию значение нашей переменной. При этом функция может что угодно делать со значением, но не сможет изменить саму переменную. Когда программа вернётся из функции значение переменной останется тем же, что было до вызова. 2) Мы можем передать в функцию указатель на переменную. При этом функция уже может изменять значение переменной. То есть, когда программа вернётся из функции значение переменной может быть отличным от значения до вызова. 3) А теперь представим, что наша переменная сама по себе является указателем. При этом всё описанное раньше будет справедливо и для неё. Если нам не требуется изменений нашей переменной, то в функцию мы будем передавать её значение (указатель). Если же нам нужно, что бы функция изменяла переменную, то мы будем передавать в неё указатель на переменную (указатель на указатель).
1
|
1647 / 1095 / 488
Регистрация: 17.07.2012
Сообщений: 5,356
|
|
19.08.2018, 13:15 | 15 |
Человек задал логичный вопрос. Где на практике это все нужно?!
Это все и так понятно, можно хоть указатели создавать, хоть указатели на указатели, хоть указатели на указатели на указатели. Вопрос ТС в другом. Где это действительно будет нужно в реальной жизни? Ведь глупо создавать указатели просто так, для прикола. Выше уже были хорошие примеры - создать матрицу, изменить указатель в функции. Но 1) В С++ есть вектора(используя которые можно вообще не думать о выделении памяти), велосипедить свою матрицу на указателях смысла нет(разве только в образовательных целях) 2) С++ не Си, если нужно менять в функции указатель проще передавать его по ссылке Возможно я не совсем прав, но мне кажется в реальном коде указатели на указатели это редкий зверь.
0
|
2708 / 862 / 326
Регистрация: 10.02.2018
Сообщений: 2,042
|
|
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 делаться следующие запросы и что они означают? Тема указатели, зачем они нужны Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |