Помните, что в большинстве контекстов выражения массива имеют свои типы, неявно преобразуемые ("распад") из "N-элементного массива T" в "указатель на T" и вычисляющие адрес первого элемента. Когда вы передаете CodedGreen (тип int [X][Y][Z]
) в Green_Decode_Tree, функция получает значение указателя типа int (*)[Y][Z]
.
Итак, ваш прототип для Green_Decode_Tree должен быть
void Green_Decode_Tree(node *tree, int (*code)[Y][Z], int num, int row, int col)
Обратите внимание, что в контексте объявления параметров функции int *a
является синонимом int a[]
(без размера), поэтому int (*code)[Y][Z]
также можно записать как int code[][Y][Z]
. Я предпочитаю использовать указатель нотации, так как это то, что функция фактически получает, но любая из них будет работать. Обратите внимание, что в вашей функции она будет выглядеть так:
if (code[row][num][col] == 1)
, так как подстрочный оператор неявно разыменовывает указатель (т.е. code[row]
== *(code+row)
).
Это может быть полезно:
Declaration Expression Type Decays to
----------- ---------- ---- ---------
T a[X]; a T [X] T *
&a T (*)[X]
T b[X][Y]; b T [X][Y] T (*)[Y]
&b T (*)[X][Y]
b[i] T [Y] T *
&b[i] T (*)[Y]
T c[X][Y][Z]; c T [X][Y][Z] T (*)[Y][Z]
&c T (*)[X][Y][Z]
c[i] T [Y][Z] T (*)[Z]
&c[i] T (*)[Y][Z]
c[i][j] T [Z] T *
Выражения a
, b
, b[i]
, c
, c[i]
и c[i][j]
являются выражениями массива, поэтому их типы будут переходить в типы указателей в большинстве контекстов. Исключения составляют случаи, когда выражения массива являются операндами операторов sizeof
или address-of &
(как показано в таблице) или когда выражение массива является строковым литералом, используемым для инициализации другого массива в объявлении.