|
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 24
|
||||||||||||||||
Имя массива в С++ это указатель или ссылка?12.06.2020, 14:18. Показов 12605. Ответов 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
Указатель или ссылка на указатель. В чем разница? Указатель на константную строку и имя массива как указатель
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 12.06.2020, 23:53 | |
|
argcargv,
1) хорошо, что про std::move не вспомнил ![]() 2) я к тому, что будет в returns ты это не уточнил 3) да никто не спорит с тем что идея назначить указателям значения из твоей ссылки было позже чем addressof 4) я не проводил хороших анализов поэтому ничего предлагать не буду, вместо этого мне просто нужно было что бы ты подкрепил свои доводы 5) можно и так ) не суть, главное что бы отражало ту картину которую ты нарисовалладно, я вижу разговор к сожалению заходит в тупик, в связи с чем предлагаю замять это дело...
0
|
|
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
|
| 12.06.2020, 23:58 | |
|
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 13.06.2020, 00:17 | ||
|
argcargv,
Круто... А ты дальше читал?
0
|
||
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
|
| 13.06.2020, 00:21 | |
|
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 13.06.2020, 01:05 | |
|
argcargv,
А то что тут Имя массива в С++ это указатель или ссылка? Ты говоришь что оператор определён для значений указателя а не для адресов. Затем тебя никак не смущает что значение указателя вполне себе может быть адресом. Т.к значение может быть адресом, и сравниваем мы значения, в получается что в таком случае мы сравниваем адреса. Тогда я так понимаю твой вариант описания addressof ошибочный... значение указателя в твоей интерпретации по ссылке выше не бывает адресом, оказывается противоречивым. Потому что если значение указателя не бывает адресом, то как тогда addressof может возвращать предлагаемый тобой pointer? Ведь значение поинтера как мы выяснили может быть адресом ) Добавлено через 3 минуты обновил
0
|
|
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
|
| 13.06.2020, 01:18 | |
|
0
|
|
|
Злостный нарушитель
10359 / 5774 / 1274
Регистрация: 12.03.2015
Сообщений: 26,686
|
|
| 13.06.2020, 01:58 | |
|
Пока до мордобоя не дошло:
Кликните здесь для просмотра всего текста
0
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||
| 13.06.2020, 03:51 | |||
|
Хорошо бы вы еще раз рассмотрели пример выше и поняли, что совсем необязательно привлекать какой-то стек и регистры для представления того, что там происходит. Стек и регистры возникают, если вообще возникают, значительно позже. И когда они возникли, то язык С++ уже закончился.
0
|
|||
|
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 24
|
|||
| 13.06.2020, 06:52 [ТС] | |||
|
В моей голове итак сейчас такая каша! ... а тут еще это! Каким образом значение указателя не может быть адресом? Как по мне так оно не может быть ничем другим кроме адреса! Хоть он явный хоть он неявный - это должно быть какое-то число равное адресу. Собственно потому его так и назвали наверное что он указывает и говорит о том что какой-то объект находится по конкретному адресу содержащемуся в указателе. Что-то слишком дохрена абстракций на мою голову... это меня убивает) Чем мне нравится ассемблер - так это своей конкретикой... есть память, есть регистры... и делай с ними все что хочешь в рамках набора команд! Все просто и конкретно. Добавлено через 3 минуты
0
|
|||
| 13.06.2020, 06:53 | |
|
0
|
|
|
Вездепух
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,235
|
||
| 13.06.2020, 06:54 | ||
lea регистр, адрес и mov регистр, указатель (в терминах ассемблера x86) - это фактически та же разница между lvalue и указателем, которую мы обсуждаем здесь. И в ассемблере тоже они зачастую вызывают трудности с пониманием.
0
|
||
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
||
| 13.06.2020, 09:52 | ||
|
Понятие "адрес" связано со значениями указателей косвенно и особо в языке нигде не участвует. Из мест, где играет роль то, какой адрес представляют значения указателей, могу вспомнить только: сравнение указателей на равенство и std::launder.
0
|
||
|
"C with Classes"
|
||
| 13.06.2020, 10:30 | ||
offset в источнике команды mov не пропустил? и что понимается под адрес и указатель?
0
|
||
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
||||
| 14.06.2020, 08:41 | ||||
0, а не то, что под "первым" понимается элемент, чей адрес совпадает с адресом самого массива, как в
1
|
||||
| 14.06.2020, 08:41 | |
|
Помогаю со студенческими работами здесь
134
как такое правильно писать? это ссылка на указатель? Что лучше ссылка или указатель?
Как ускорить работу. Ссылка или указатель
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
делаю науч статью по влиянию грибов на сукцессию
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
На первой гифке отладочные линии отключены, а на второй включены:. . .
|