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