|
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 24
|
||||||||||||||||
Имя массива в С++ это указатель или ссылка?12.06.2020, 14:18. Показов 12613. Ответов 133
Метки нет (Все метки)
Пытаюсь понять что такое имя массива в С++! Указатель или ссылка? Сразу скажу что пока рассматриваю только статические массивы.
Теория говорит что это указатель, собственно поэтому для имени массива применима арифметика указателей. Но! раз это указатель, то значит это переменная под которую компилятор выделил ячейку памяти в которой должен храниться адрес первого элемента массива arr[0]. Раз такая ячейка памяти есть то по идее можно узнать ее адрес так - &arr! К сожалению такой трюк не работает и получается что &arr==arr! Для меня это никак не укладывается под описание указателя. Попробовал выяснить по аналогии с простой переменной что такое указатель, а что такое ссылка! Вот простенький код для простой переменной и результат его выполнения: Кликните здесь для просмотра всего текста
Результат говорит о том что если переменная "b" - указатель на переменную "a", то переменная b находится в памяти по адресу &b и содержит значение адреса переменной a равное &a. Все вполне согласуется с теорией. Если же переменная "d" - ссылка на переменную "a", то для переменной b вроде как не выделяется памяти, по крайней мере собственного адреса в памяти для переменной d нет и операция &d дает лишь адрес переменной a. Если поступить аналогично с массивом? Кликните здесь для просмотра всего текста
Если объявить указатель pArr на массив arr, то видно что для pArr аналогично указателю простой переменной выделяется место в памяти с адресом &pArr в которой содержится адрес первого элемента массива arr[0]. Все как бы укладывается в мои представления. А что же с именем массива? Ведь утверждается что это указатель на 1й элемент этого массива arr[0]. Операция &arr дает адресс такой же как и у первого элемента массива, как будто нет никакого указателя а есть ссылка по аналогии с обычной переменной! Но почему же тогда для имени массива доступна арифметика указателя? для обычной ссылки такого ведь нет. В последнем примере все указатели имеют тип void* (не знаю насколько это корректно), поэтому думаю что корректней следующий код, но результат тот же самый! Имя массива как будто является ссылкой а не указателем. Кликните здесь для просмотра всего текста
У меня такое представление об указателях, что это переменная которая в памяти имеет собственное место т.е. имеет свой адрес и содержит адрес переменной на которую указывает. примерно как на следующем рисунке: Все же объясните что такое имя массива? указатель или ссылка? или у меня неправильное представление об этих вещах?
0
|
||||||||||||||||
| 12.06.2020, 14:18 | |
|
Ответы с готовыми решениями:
133
Указатель или ссылка на указатель. В чем разница? Указатель на константную строку и имя массива как указатель
|
|
Злостный нарушитель
10359 / 5774 / 1274
Регистрация: 12.03.2015
Сообщений: 26,686
|
|
| 12.06.2020, 14:28 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 24
|
||
| 12.06.2020, 14:37 [ТС] | ||
|
в то время как например у указателя pArr из моего примера оно есть!
0
|
||
|
Злостный нарушитель
10359 / 5774 / 1274
Регистрация: 12.03.2015
Сообщений: 26,686
|
|
| 12.06.2020, 14:45 | |
|
0
|
|
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 12.06.2020, 14:46 | ||
|
Имя массива неявно преобразуется к указателю на первый элемент. Можно получить ссылку на массив ( T(&)[n]).Можно получить указатель на массив ( T(*)[n]).Но его нельзя изменить(всмысле присвоить другой массив).
2
|
||
|
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 24
|
||
| 12.06.2020, 15:15 [ТС] | ||
|
теперь представим что массив это та же переменная на которую указывает указатель (только указывает не на все элементы массива разом а только на 1й). т.е. по идее должна быть такая же ячейка в памяти в которой хранится адрес 1го элемента массива. Раз есть ячейка в памяти, то у нее должен быть свой адрес!
0
|
||
|
Злостный нарушитель
10359 / 5774 / 1274
Регистрация: 12.03.2015
Сообщений: 26,686
|
|||
| 12.06.2020, 15:45 | |||
|
0
|
|||
|
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 24
|
|||
| 12.06.2020, 15:59 [ТС] | |||
|
но судя по твоей картинке ты создал динамический массив, а я про статический писал! у статического массива вытащи адрес указателя точно также! у меня не получилось - как будто его нет. Добавлено через 1 минуту
0
|
|||
|
Неэпический
|
||||||||
| 12.06.2020, 16:01 | ||||||||
![]() Давай по существую ты знаешь что такое массив? Вот имя массива - это идентификатор, "обозначающий" данный массив. Является ли идентификатор ссылкой или указателем? Нет, не является. Является ли массив ссылкой или указателем? Нет, не является. Как уже сказано выше, &arr - это адрес массива. И тип у него соответствующий. Мы можем неявно получить указатель на первый элемент массива, при этом массив указателем не является.
0
|
||||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 12.06.2020, 16:08 | |
|
cahmep,
Просто имя массива преобразуется в указатель на первый элемент массива в некоторых контекстах поэтому часто путают имя массива с указателем... Но само по себе имя массива это не указатель и не ссылка (как выше подметили).
0
|
|
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
|
| 12.06.2020, 16:10 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 24
|
||||
| 12.06.2020, 16:31 [ТС] | ||||
|
судя по всему такой переменной-указателя не существует, а есть просто адрес массива==адрес нулевого элемента arr... но к этому имени массива, который как получается указателем по сути не является, применяется арифметика указателя каким то образом. это как? Добавлено через 5 минут
0
|
||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 12.06.2020, 16:33 | ||
|
Судя по тому, что вы сейчас задаете вопросы эти, то вы не читали свою же тему? Что такое &arr + i
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||||
| 12.06.2020, 16:36 | |||||||
|
например в случае когда массив передается в функцию а параметр указатель - тогда имя будет преобразовано в указатель
0
|
|||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||||||
| 12.06.2020, 16:38 | |||||||
пользовательское неявное преобразование, а в случае с массивом - стандартное.
0
|
|||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||
| 12.06.2020, 16:55 | |||||
Теперь посмотрим, что такое sizeof от array:
А элементы массива хранятся смежно (вторая цитата) Размер же массива это n*sizeof(array) (третья цитата) Тогда если &arr возвращает нам первый байт объекта (в данном случае массива) и все элементы хранятся смежно как видно выше и память массива состоит лишь из его элементов то можно сделать вывод что &arr адрес массива совпадает с адресом его первого элемента. Почему нет? Добавлено через 1 минуту Чем не гарантия? Объясните, пожалуйста.
0
|
|||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||||||
| 12.06.2020, 17:00 | |||||||
Моделирует точно такое же поведение, какое вы видите в своем описании. Теперь к вам вопросы: 1) arr теперь из-за этого стал ссылкой или указателем? Нет, как был объектом типа int_array4, так и остался.2) Что удивительного, что &arr и arr дают один и тот же адрес? Объект arr содержит объект a0 первым и поэтому их адреса совпадают. В случае в массивами вы видите те же самые закономерности.
2
|
|||||||
|
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 24
|
||
| 12.06.2020, 17:00 [ТС] | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 12.06.2020, 17:02 | |
|
0
|
|
| 12.06.2020, 17:02 | |
|
Помогаю со студенческими работами здесь
20
как такое правильно писать? это ссылка на указатель? Что лучше ссылка или указатель?
Как ускорить работу. Ссылка или указатель
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|