Почему я могу использовать адрес адреса без каких-либо ошибок?

Я нашел коды, которые используют оператор адреса для адреса. См. ниже примеры кодов.

int arr[4] = { -1, -1, -1, -1 };
int arr2[4] = { 0, 0, 0, 0 };

memcpy(arr, &arr2, sizeof(arr2)); // & operator to arr2

И я понятия не имею, почему эти коды действительны. (я использую С++ 14)

&arr2 — адрес массива в целом. arr2 сам по себе распадается на адрес первого элемента массива. Бывает так, что массив и его первый элемент находятся по одному и тому же адресу.
Igor Tandetnik 23.02.2023 01:54

Some programmer dude 23.02.2023 01:59

Краткий ответ - потому что язык позволяет это

Slava 23.02.2023 02:01

Также обратите внимание, что из-за распада массива на указатель очень сложно передавать массивы функциям. В качестве аргумента объявление int arr[] (или даже использование такого размера, как int arr[4]) рассматривается как int *arr. Если вы затем используете оператор указателя на переменную-аргумент, вы получите указатель на эту переменную (имеющую тип int **), а не на исходный массив.

Some programmer dude 23.02.2023 02:02

И в С++, пожалуйста, не используйте простые массивы, если вы можете этого избежать. Если размер фиксирован и известен во время компиляции (и не слишком велик), используйте std::array (как в std::array<int, 4>). В противном случае используйте std::vector. Это решит множество проблем, с которыми вы можете столкнуться при использовании простых массивов в стиле C.

Some programmer dude 23.02.2023 02:04

Эти ответы ясны и полезны. Спасибо за ответы и дополнительные пояснения!

RAMSA 23.02.2023 02:21
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
1
6
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
Почему я могу использовать адрес адреса без каких-либо ошибок?

Потому что std::memcpy принимает аргументы типа void* (кроме квалификатора const), а все указатели на объекты неявно преобразуются в void*.

Хотя arr сам по себе не является указателем, это массив, а массивы неявно преобразуются в указатель на первый элемент, который неявно преобразуется в void*.

Место в памяти первого элемента массива совпадает с местом в памяти массива.

Другие вопросы по теме