исключением случаев, когда это операнд из 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]) { ... }
, который выглядит немного чище, чем указатель на синтаксис массива; однако я предпочитаю первое, поскольку он точно описывает, что происходит.Обратите внимание, что это только true в контексте объявления параметра функции.
Так что, учитывая заявление T a[N][M];
, следующий все справедливы
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
, всегда и всегда имеет тип массива.
Привет, Пол, спасибо, это работает ... но я не знаю, как интерпретировать логику этого. – user437777
@ user437777: ОК - Я добавил немного больше разъяснений - HTH –
Привет, Пол, спасибо за разъяснение. .. Я проверил значения, которые он прошел внутри функции. Он правильно передал мне адреса 1-го и 2-го столбцов. Чтобы получить адреса строк, мне нужно вручную извлечь с помощью somekind смещения указателя? – user437777