Странное поведение arr[] в случае, когда arr представляет собой двумерный массив

Я узнавал о 2D-массивах и представлении указателей на них и все такое. Я выполнил следующее, чтобы получить внутреннюю работу с 2d-массивами. Я получил странные результаты для arr2d[0]

    int arr2d[2][3]{{1,2,3},{4,5,6}};
    cout<<"&arr2d[0][0] :"<<&arr2d[0][0]<<endl;
    cout<<"(&(arr2d[0])) :"<<(&(arr2d[0]))<<" arr2d[0] :"<<arr2d[0]<<endl;
    cout<<"*(arr2d[0]) :"<< *(arr2d[0])<<" *(&(arr2d[0])) :"<<*(&(arr2d[0]))<<endl;

Выход:

&arr2d[0][0] :0x3e6d7ff6c0
(&(arr2d[0])) :0x44efbffbe0 arr2d[0] :0x44efbffbe0
*(arr2d[0]) :1 *(&(arr2d[0])) :0x44efbffbe0

Как *(arr2d[0]) может иметь 1 в качестве вывода, если сам arr2d[0] «указывает по кругу»? Также очевидно, что артиметика указателя не работает для arr[0], так как arr[0]+1 не приводит к arr[1].

Я не ожидал, что arr[0] будет циклически указывать на себя, я ожидал, что это будет указатель на одномерный массив длины 3. this говорит, что это происходит, но я хочу знать, почему arr[0] может указывает на себя, но в то же время *(arr[0]) дает 1?

Что вы имеете в виду под "указать на себя"? Весь массив, первая строка и первый элемент имеют одинаковый адрес.

463035818_is_not_a_number 10.01.2023 18:54

Массив в C++ — это просто последовательность его элементов, непрерывных в памяти. Массив int[3] представляет собой последовательность int[3] в памяти, а int[3] сам по себе является последовательностью int в памяти. Разыменование удаляет один слой этого и довольно похоже на получение нулевого элемента для начала. На самом деле, в отсутствие возможных проблем с выравниванием и других запутанных деталей памяти, int[2][3] в основном то же самое, что и int[6].

Silvio Mayolo 10.01.2023 18:56

Детали имеют значение, вывод кода, который вы разместили, не начинается с 12345

463035818_is_not_a_number 10.01.2023 18:56

Боковое примечание: многие люди учат, что массив является указателем на его первый элемент. Это неправда. Массив есть массив. он просто преобразует распадается в указатель легко и автоматически.

user4581301 10.01.2023 19:01

Очень похоже: Что такое массив для распада указателя?

πάντα ῥεῖ 10.01.2023 19:04

Этот вывод не может быть создан этим кодом. Пожалуйста, опубликуйте минимальный воспроизводимый пример.

n. m. 10.01.2023 19:08

Shashank Rana 10.01.2023 19:14
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они...
Уроки CSS 6
Уроки CSS 6
Здравствуйте дорогие читатели, я Ферди Сефа Дюзгюн, сегодня мы продолжим с вами уроки css. Сегодня мы снова продолжим с так называемых классов.
Что такое Css? Для чего он используется?
Что такое Css? Для чего он используется?
CSS, или "Каскадные таблицы стилей", - это язык стилей, используемый в веб-страницах. CSS является одним из основных инструментов веб-разработки...
1
7
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
Как *(arr2d[0]) может иметь 1 на выходе, если arr2d[0] сам «указывает по кругу»?

Он не указывает на себя. Массивы не являются указателями, но, как и любая переменная, они имеют адрес, а адрес массива совпадает с адресом первого элемента. Это распространяется на многомерные массивы, поэтому arr2d, arr2d[0] и arr2d[0][0] имеют один и тот же адрес, хотя их типы разные.

очевидно, артиметика указателя не работает для arr[0], так как arr[0]+1 не доходит до arr[1].

463035818_is_not_a_number 10.01.2023 19:11

@ 463035818_is_not_a_number Хороший улов. Обновлено.

dbush 10.01.2023 19:12

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