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

Раньше я чувствовал растерянность по поводу этого кода

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 и понять «тайну» имени массива, включая некоторые явные и неявные преобразования.

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

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

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

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



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

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

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

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


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

3

Решение

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

Существует неявное преобразование из 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],

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]