Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.70/27: Рейтинг темы: голосов - 27, средняя оценка - 4.70
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

Что такое указатель на массив?

18.02.2020, 15:28. Показов 6645. Ответов 108
Метки нет (Все метки)

Указатель на массив это указатель на первый элемент массива?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.02.2020, 15:28
Ответы с готовыми решениями:

Что такое хэндлер файла? Что такое файловый указатель?
Что такое хэндлер файла? Что такое файловый указатель?

Что такое указатель на абстрактный класс?
В задании сказано - Методы класса должны принимать указатель на абстрактный класс , что это значит и как это реализовывается?

Что такое указатель на член класса?
Что такое указатель на член класса?

108
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.02.2020, 09:03
Цитата Сообщение от ReYalp Посмотреть сообщение
а то что arr заменяется на &arr[0] это правда
Нет, это тоже неправда.
Оно не заменяется, а приводится. Т.е. в определенные моменты одна сущность порождает другую. При этом исходная сущность никуда не девается. Вы понимаете, что значит приведение?

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
В книге должно быть "неявно преобразовывает", а не "автоматически заменяет".
Кстати, конкретно в случае с Липпманом это все-таки может быть ошибка переводчика.
Я не очень-то верю в то, что Липпман стал бы пользоваться подобного рода упрощениями.
В какой-то другой книге другого автора - возможно, видел такое.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 09:06  [ТС]
DrOffset, точнее сказать не с массивами, а с указателя и на них. Вы сами раньщ писали что arr неявно становится указателем на первый подмассив( я пишу о int arr[10][20]), тоесть arr = int (*p) [20], что будет если я теперь сделаю &arr? Разве не адрес указателя?
0
19.02.2020, 09:06

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Кстати, конкретно в случае с Липпманом это все-таки может быть ошибка переводчика.
Возможно. Я не читал. Или читал, но не помню. :)

0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 09:07  [ТС]
DrOffset, ну просто в книге есть отдельно неявно преобразовывает и отдельно автоматически заменяет, мне кажется ошибки перевода нету
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.02.2020, 09:09
ReYalp, название, издание и главу где это написано напишите.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 09:11  [ТС]
Croessmah, int arr [10][20] - arr даст int (*p) [20], &arr даст int (*p) [10]?

Добавлено через 1 минуту
Croessmah, Липпман 5-е издание 3.5.3 Указатели и массивы
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.02.2020, 09:14
Ну точно. Вот цитат из оригинала:
In particular, as we’ll see, when we use an array, the compiler ordinarily converts the array to a pointer.
coverts - это не заменяет, а преобразует.
2
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 09:16  [ТС]
DrOffset, ладно, но что с примером, я же беру & адресс int(*p) [20] указателя, чем это не адресс указателя?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.02.2020, 09:17
Цитата Сообщение от ReYalp Посмотреть сообщение
&arr даст int (*p) [10]?
Нет. arr имеет тип int[10][20], значит указатель на него имеет тип int(*)[10][20].
arr неявно может быть преобразован в указатель на первый элемент - int(*)[20]
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.02.2020, 09:19
Цитата Сообщение от ReYalp Посмотреть сообщение
int arr [10][20] - arr даст int (*p) [20], &arr даст int (*p) [10]?
C++
1
2
3
4
5
    int arr [10][20];
    
    int (*p1)[10][20] = &arr;
    
    int (*p2)[20] = arr;
Добавлено через 1 минуту
Цитата Сообщение от ReYalp Посмотреть сообщение
ладно, но что с примером, я же беру & адресс int(*p) [20] указателя, чем это не адресс указателя?
В вашем примере нет указателей. Есть объект типа "массив", адрес которого вы берете.
Адрес указателя был бы, если бы вы брали адрес у объекта типа "указатель".
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 09:23  [ТС]
DrOffset, теперь все более менее стало на свои места, адреса у них одинаковые потому указывают они оба неявно преобразовываются в &arr[0][0]?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.02.2020, 09:27
Цитата Сообщение от DrOffset Посмотреть сообщение
In particular, as we’ll see, when we use an array, the compiler ordinarily converts the array to a pointer.
А чуть ниже?
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.02.2020, 09:32
Цитата Сообщение от ReYalp Посмотреть сообщение
Вы сами раньщ писали что arr неявно становится указателем
Это про этот пост?
Цитата Сообщение от DrOffset Посмотреть сообщение
ReYalp, ну вот.
Операция индексации всегда содержит адресную арифметику, потому что
C++
1
arr[1] // *(arr + 1)
таким образом, если вы просто используете индексацию в двумерном массиве, то вы всегда имеете дело с указателями на массив.
C++
1
arr[1][2] // *(*(arr + 1) + 2)
где
arr + 1 даст double(*)[20]
*(arr + 1) даст double[20]
*(arr + 1) + 2 даст double *
*(*(arr + 1) + 2) даст double,
Где я писал, что он именно становится? )
Вы не понимаете, что значит "преобразуется"? Представьте, что везде, где это требуется, у нас есть неявный вызов функции. Т.е.
C++
1
arr[1][2] // *(convert_to_pointer( *(convert_to_pointer( arr ) ) + 1) + 2)
Так понятнее?
Понятно, что arr никак не меняется. Это неявный аргумент неявной функции преобразования, которую выполняет компилятор.
Правила преобразования описаны в стандарте языка:
An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue of type “pointer to T”.
The temporary materialization conversion ([conv.rval]) is applied.
The result is a pointer to the first element of the array.
https://eel.is/c++draft/conv.array

Добавлено через 2 минуты
Цитата Сообщение от ReYalp Посмотреть сообщение
теперь все более менее стало на свои места, адреса у них одинаковые потому указывают они оба неявно преобразовываются в &arr[0][0]?
Конечно нет. Адреса одинаковые, потому что они оба указывают на одну и ту же память.
Все примеры, что я вам давал выше вы не разбирали, не запускали, не экспериментировали и не думали?
В общем я предлагаю вам перестать пока тут спрашивать и уже позаниматься практикой.
Иначе никакого терпения отвечать по 10 раз на одно и то же ни у кого не хватит.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 09:35  [ТС]
DrOffset, самый запутанный для меня момент - cout << arr, что выводит cout? &arr[0][0]? &arr? Или int (*) [10][20] что собственно тоже самое
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.02.2020, 09:39
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот цитат из оригинала:
Цитата Сообщение от Croessmah Посмотреть сообщение
А чуть ниже?
А чуть ниже так
However,arrays have a special property—in most places when we use an array, the compiler automatically substitutes a pointer to the first element
0
19.02.2020, 09:40

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
А чуть ниже?
Да, ниже там есть это упрощение и в оригинале.
Переводчик реабилитирован.
:)

0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.02.2020, 09:45
Цитата Сообщение от ReYalp Посмотреть сообщение
самый запутанный для меня момент - cout << arr, что выводит cout?
Давай сначала без cout.
C++
1
2
3
4
5
void foo(void * p);
//...
int arr[10][20];
//...
foo(arr);//Что уйдет в foo?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
19.02.2020, 09:45
Цитата Сообщение от ReYalp Посмотреть сообщение
самый запутанный для меня момент - cout << arr, что выводит cout? &arr[0][0]? &arr? Или int (*) [10][20] что собственно тоже самое
C++
1
std::cout << arr;
это во что:
C++
1
std::operator<<(std::cout, arr);
operator<< в данномслучае подходит только один
вот такой:
C++
1
operator(std::ostream & out, void * ptr);
итого имеем два преобразования за раз в этом вызове
т.е.
C++
1
std::operator<<(std::cout, convert_pointer_to_void_pointer( convert_array_to_pointer(arr) ) )
convert_array_to_pointer для примера из 70 поста даст int (*)[20]
а convert_pointer_to_void_pointer даст void *
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 09:46  [ТС]
DrOffset, так что выводит cout << arr? неявно кастит в int (*) [20],или просто выводит адресс? Тогда адресс чего он выводит? Первого элемента в массиве?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.02.2020, 09:46
Цитата Сообщение от Croessmah Посмотреть сообщение
Давай сначала без cout
Ладно, отбой, DrOffset уже написал. )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.02.2020, 09:46

Указатель на ссылку или что это такое?
void add(char aData, Branch *&amp;aBranch); Речь об аргументе aBranch. Как это понимать? Указатель на ссылку? Не понятно. Вроде такое не...

Что такое указатель и с чем его есть
Я уже не знаю что делать, но в книжке очень непонятно написано про указатели. Не могли бы вы объяснить что такое указатели и зачем они. И...

Что такое указатель на массив и как им пользоваться?
Всем привет! Нужна информация по сабжу, как объявлять, и что вообще представляет собой(указатель на первый элемент массива, а может на...

Что такое указатель?
Указатель - это переменная, которая в хранит качестве своего значения адрес байта памяти. Что значит адрес байта памяти? К примеру...

Что быстрее использовать, массив э-в, или указатель на массив э-в?
уважаемые, что быстрее использовать, массив э-в, или указатель на массив э-в? или без разницы? С одной стороны обращается все к той же...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
[golang] Insert Delete GetRandom O(1) (Leetcode: 380)
alhaos 16.06.2026
Insert Delete GetRandom O(1) Сложность: Medium Источник: LeetCode 380 Задача Реализовать структуру данных RandomizedSet, которая поддерживает следующие операции за O(1) в среднем:
Свет в конце тоннеля
kumehtar 16.06.2026
Поймал себя на одной мысли. Раньше мне всегда казалось неправильным жить без чёткого понимания, куда всё идёт. Будто я иду по дороге судьбы, но не знаю, куда она ведёт. А раз не знаю — значит,. . .
[golang] Реализация стека с поддержкой получения минимального элемента за O(1)
alhaos 16.06.2026
Min Stack Сложность: Medium Источник: LeetCode 155 Задача: Реализовать стек который поддерживает push, pop, top и получение минимального элемента за O(1). Методы:
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru