Как понять, что разыменование указатель на массив получить указатель на элемент?
Раньше я чувствовал себя смущенным из-за этого кода
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]
,