|
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 24
|
||||||||||||||||
Имя массива в С++ это указатель или ссылка?12.06.2020, 14:18. Показов 12607. Ответов 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
Указатель или ссылка на указатель. В чем разница? Указатель на константную строку и имя массива как указатель
|
|
Вездепух
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,235
|
|||
| 12.06.2020, 19:33 | |||
|
Вопрос не ясен. При чем здесь вообще ссылки?
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||||||||
| 12.06.2020, 19:39 | |||||||||
|
Вот ваш пример
Давайте возьмем математику для примера. Допустим у вас есть такое математическое выражение x + nВы же не будете утверждать, что х хранит его результат?Чтобы получить результат нужно сначала вычислить выражение.
1
|
|||||||||
|
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 24
|
||
| 12.06.2020, 19:42 [ТС] | ||
|
в регистрах это мне понятно и как раз не обязательно в памяти хранить указатель
0
|
||
|
"C with Classes"
|
|
| 12.06.2020, 19:44 | |
|
cahmep, свой компилятор напиши и все вопросы отпадут.
0
|
|
|
Вездепух
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,235
|
||
| 12.06.2020, 19:50 | ||
char a[10], хранящийся по адресу 0x1000, и вы в своем коде хотите получить доступ к элементу a[5], то понятно, что в какой-то момент времени процессор должен будет вычислить адрес 0x1005 для доступа к элементу.Но это совсем не значит, что сначала он должен будет взять адрес 0x1000, а затем прибавить к нему 5. Вполне возможно, что уже на этапе компиляции компилятор сразу поймет, что нужно осуществить доступ по адресу 0x1005 и все. То есть во время выполнения процессор сразу будет знать, ничего не вычисляя, что ему нужно прочитать данные с адреса 0x1005. При этом адрес 0x1000 (реальный адрес массива a) в программе вообще в явном виде нигде фигурировать не будет.
0
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||||||
| 12.06.2020, 19:56 | |||||||
|
Смотрите:
a - имеет адрес.Далее переменная а копируется в безымянную временную "переменную" через return. У нее тоже пусть будет адрес.Далее эта переменная копируется в именованную переменную b, у нее, естественно, тоже есть адрес.Итого 3 адреса. Но если подумать, то второй адрес нам не нужен, потому что временное значение можно не размещать в памяти (в том числе и в регистрах). Зачем он нам нужен, если у нас есть a и есть b? Зачем нам этот посредник? Вот и получается, что временное значение имеет абстрактный характер. Оно естественно есть на этапе компиляции и мы производим с ним операции - оно участвует в выражении инициализации b. Но фактически адреса у него нет, потому что в реальности мы сразу копируем a в bДобавлено через 6 минут <уточнил формулировки> если вы читали старую версию - перечитайте.
0
|
|||||||
|
Комп_Оратор)
|
||
| 12.06.2020, 19:59 | ||
|
Указатели lvalue нужно создавать, а rvalue создаются автоматически по мере надобности.
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 12.06.2020, 20:14 | ||
А если значение указателя это все же адрес, то что не так ?
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 12.06.2020, 20:21 | |
|
argcargv,
Там же написано про то каким будет результат сравнения указателей а не про то чем является значение указателя... Добавлено через 26 секунд Я имею ввиду зеленую часть
0
|
|
|
Комп_Оратор)
|
||
| 12.06.2020, 20:21 | ||
|
0
|
||
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
||||
| 12.06.2020, 20:23 | ||||
|
Добавлено через 1 минуту
0
|
||||
|
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 24
|
||
| 12.06.2020, 20:29 [ТС] | ||
|
ну да ладно, это не вопрос данной темы) в след раз возможно к нему вернемся) Ребят, всем спасибо!!! Разжевали! Думаю понимание сложилось... теперь нужно переварить и утрясти))) Ключевой момент моего недопонимания, наверное, как раз и было то что указатель, как оказалось, это не обязательно переменная в памяти.
0
|
||
|
Комп_Оратор)
|
||
| 12.06.2020, 20:30 | ||
|
0
|
||
|
Комп_Оратор)
|
||
| 12.06.2020, 20:33 | ||
|
argcargv, вот полная цитата:
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||||
| 12.06.2020, 20:34 | ||||||||
а адрес не входит в тот список который вы прислали https://timsong-cpp.github.io/... sentence-8 тогда здесь если вам верить то получается что код выше содержит UB? ![]() ведь выше получается что мы присваиваем указателю значение которое не входит в тот список...
0
|
||||||||
| 12.06.2020, 20:34 | |
|
Помогаю со студенческими работами здесь
80
как такое правильно писать? это ссылка на указатель? Что лучше ссылка или указатель?
Как ускорить работу. Ссылка или указатель
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
делаю науч статью по влиянию грибов на сукцессию
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
На первой гифке отладочные линии отключены, а на второй включены:. . .
|