Как понять, что разыменование указатель на массив получить указатель на элемент?

Раньше я чувствовал себя смущенным из-за этого кода

int a[3] = {1,2,3};
int b[2][3] = {...};
int (*p1)[3] = &a;  //pointer to array[3]
int (*p2)[3] = b; //same as above
int (*p3)[2][3] = &b; // pointer to array[2][3]

затем я прочитал несколько постов 1 и понял "тайну" имени массива, включая некоторые явные и неявные преобразования.

Итак, теперь я знаю, что p1 является указателем на массив из 3 элементов с типом int.

Но как это понять *(int (*)[3]) получает тип int * или же

*(int (*)[2][3] получает тип int (*)[3]?

Это то, что я должен выучить наизусть?


посты, которые я прочитал:

Является ли имя массива указателем?

Разница между `a` и`&a` в C++, где `a` - массив

Массив для затухания указателя и передачи многомерных массивов в функции


PS: я не знаю, если это глупый вопрос. Но после прочтения постов я уже упоминал выше. Я все еще чувствую себя немного странно по поводу этой операции разыменования. Может быть, это просто, как работает синтаксис языка, который я должен просто помнить и перестать копать.:D

1 ответ

Во-первых, вы должны понимать распад массива на указатель,

Существует неявное преобразование из lvalues ​​и rvalues ​​типа array в rvalues ​​типа указателя: он создает указатель на первый элемент массива. Это преобразование используется всякий раз, когда массивы появляются в контексте, где массивы не ожидаются, но указатели

Например, a (int [3]) может распасться на int *, b (int [2][3]) может распасться на int (*)[3],

затем

как это понять *(int (*)[3]) получает тип int * или же *(int (*)[2][3] получает тип int (*)[3]?

Это зависит от контекста; точнее, учитывая p с типом int (*)[3] (т.е. указатель на массив), *p получит массив (int [3]), который мог бы распасться на int *,

Точно так же, учитывая p с типом int (*)[2][3], *p получит массив int [2][3]который мог бы распасться на int (*)[3],

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