Я узнавал о 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?
Массив в C++ — это просто последовательность его элементов, непрерывных в памяти. Массив int[3] представляет собой последовательность int[3] в памяти, а int[3] сам по себе является последовательностью int в памяти. Разыменование удаляет один слой этого и довольно похоже на получение нулевого элемента для начала. На самом деле, в отсутствие возможных проблем с выравниванием и других запутанных деталей памяти, int[2][3] в основном то же самое, что и int[6].
Детали имеют значение, вывод кода, который вы разместили, не начинается с 12345
Боковое примечание: многие люди учат, что массив является указателем на его первый элемент. Это неправда. Массив есть массив. он просто преобразует распадается в указатель легко и автоматически.
Очень похоже: Что такое массив для распада указателя?
Этот вывод не может быть создан этим кодом. Пожалуйста, опубликуйте минимальный воспроизводимый пример.
Как *(arr2d[0]) может иметь 1 на выходе, если arr2d[0] сам «указывает по кругу»?
Он не указывает на себя. Массивы не являются указателями, но, как и любая переменная, они имеют адрес, а адрес массива совпадает с адресом первого элемента. Это распространяется на многомерные массивы, поэтому arr2d, arr2d[0] и arr2d[0][0] имеют один и тот же адрес, хотя их типы разные.
очевидно, артиметика указателя не работает для arr[0], так как arr[0]+1 не доходит до arr[1].
@ 463035818_is_not_a_number Хороший улов. Обновлено.
Что вы имеете в виду под "указать на себя"? Весь массив, первая строка и первый элемент имеют одинаковый адрес.