Если двумерный массив не является двойным указателем, то почему это происходит? - PullRequest
1 голос
/ 06 июля 2019
#include <stdio.h>
int main()
{     
  int arr[3][4] = { 
                    { 10, 11, 12, 13 }, 
                    { 20, 21, 22, 23 }, 
                    { 30, 31, 32, 33 } 
                  }; 
  printf("%u, %u", arr, *arr) // Output - 1875181168, 1875181168

}

Если предположить, что любой 2D-массив (arr) не является двойным указателем, то почему arr & * arr ссылается на один и тот же адрес?

1 Ответ

7 голосов
/ 06 июля 2019

Если мы «нарисуем» массив arr на бумаге, он будет выглядеть следующим образом

+-----------+-----------+-----------+-----------+-----------+-----+
| arr[0][0] | arr[0][1] | arr[0][2] | arr[0][3] | arr[1][0] | ... |
+-----------+-----------+-----------+-----------+-----------+-----+

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

То есть &arr == &arr[0] и &arr[0] == &arr[0][0] (что, конечно, означает, что &arr == &arr[0][0]).

Различия здесь имеют типы:

  • &arr относится к типу int (*)[3][4]
  • &arr[0] относится к типу int (*)[4]
  • А &arr[0][0] относится к типу int *

Теперь, что касается arr и *arr, вы должны помнить, что массивы естественным образом распадаются на указатели на свои первые элементы.Это означает, что arr будет равно &arr[0].И разыменование указателя будет «значением», на которое указывают, так что *arr равно *(&arr[0]), что затем равно arr[0], что, в свою очередь, уменьшится до &arr[0][0].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...