За исключением случаев, когда он является операндом операторов sizeof
или унарных &
или является строковым литералом, используемым для инициализации другого массива, выражение типа "N-элементный массив T"будет неявно преобразован («распад») в тип «указатель на T», а его значением будет адрес первого элемента массива.
Когда вы вызываете func(pRxSeqAddress)
, тип выражения pRxSeqAddress
преобразуется из "2-элементного массива 2-элементного массива указателя на Int32" в "указатель на 2-элементный массивуказателя на Int32 ", или Int32 *(*)[2]
.Таким образом, прототип для func
должен быть
void func(Int32 *(*pRxSeqAddressPtr)[2]) { ... }
В контексте объявления параметров функции, T a[]
и T a[N]
являются синонимами T *a
;a
на самом деле имеет тип указателя, а не типа массива.Таким образом, вышеприведенное может быть переписано как
void func(Int32 *pRxSeqAddressPtr[][2]) { ... }
, что выглядит немного чище, чем указатель на синтаксис массива;однако, я предпочитаю первое, так как оно точно описывает, что происходит.Обратите внимание, что это only true в контексте объявления параметра функции.
Таким образом, с учетом объявления T a[N][M];
, следующие все имеют значение true
Expression Type Decays to
---------- ---- ---------
a T [N][M] T (*)[M]
&a T (*)[N][M] n/a
*a T [M] T *
a[i] T [M] T *
&a[i] T (*)[M] n/a
*a[i] T n/a
a[i][j] T n/a
Обратите внимание, что изменяется тип выражения , относящийся к массиву , а не сам массив; объект pRxSeqAddr
, определенный в main
, всегда и навсегда имеет тип массива.