C указатель на двумерные массивы - PullRequest
0 голосов
/ 03 мая 2020

Во всех моих c кодах. игнорировать вводящее в заблуждение имя идентификатора. Причина в том, что в присваивании указателя ptr61 я должен поставить оператор адреса (&), а & нет необходимости в присваивании указателя ptr62.

int var6[3][4] = {
    {1,2,3,4},
    {5,6,7,8},
    {9,10,11,12}
};

int (*ptr61)[][4];
ptr61 = &var6;
printf("lvl 9: %d\n", (*ptr61)[2][0]);

int (*ptr62)[4];
ptr62 = var6;
printf("lvl 9: %d\n",*(*(ptr62 + 1)+2));

1 Ответ

1 голос
/ 03 мая 2020

Указатель массива, используемый в выражениях, таких как, например, инициализатор, неявно преобразуется в указатель на его первый элемент.

Так что, если у вас есть такой массив

int var6[3][4] = {
    {1,2,3,4},
    {5,6,7,8},
    {9,10,11,12}
};

, тогда это объявление объявляет массив из 3 элементов типа int[4]. Таким образом, указатель на элемент массива будет иметь тип int ( * )[4], и вы можете написать

int (*ptr62)[4] = var6;

Если вы напишите

ptr62 = &var6;

, вы получите ошибку компилятора, потому что слева На стороне стороны присваивания находится объект типа int( * )[4], в то время как на правой стороне находится объект типа int( * )[3][4], и эти типы не совместимы, и не существует неявного преобразования из одного типа в другой.

Если вы хотите объявить указатель на весь массив, имеющий тип int[3][4], тогда такой указатель будет иметь тип int ( * )[3][4], и вы можете написать

int (*ptr61)[3][4] = &var6;

Что касается этого объявление

int (*ptr61)[][4] = &var6;

, затем оно объявляет указатель на неполный тип массива int[][4].

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