Тип параметра P
в определении функции tisk_pole
должен соответствовать типу аргумента P1
в вызове функции.
P1
имеет тип char [3][3]
- то есть 3-элементный массив из 3-элементного массива char
. Таким образом, декларация параметра P
в tisk_pole
должен быть одним из следующих:
void tisk_pole(char P[3][3])
или
void tisk_pole(char P[][3])
или
void tisk_pole(char (*P)[3])
исключением случаев, когда это операнд sizeof
или унарные &
или строковый литерал, используемый для инициализации массива символов в объявлении, выражение типа «N-элементный массив из T
» будет преобразован («распад») в выражение типа «указатель на T
», а значение выражения будет адресом первого элемента массива.
В вызове функции
tisk_pole(P1);
экспрессииP1
имеет тип "3-элемент массива 3-элемента массива char
" (char [3][3]
); поскольку он не является операндом операторов sizeof
или унарных &
, он преобразуется в выражение типа «указатель на 3-элементный массив char
» (char (*)[3]
) и оценивает адрес первого элемента P1
. Это означает, что tisk_pole
принимает значение , а не значение массива.
В параметре декларации в функции, T a[N]
, T a[]
и T *a
все это означает то же самое - все они объявляют a
как указатель к T
, а не массив T
. Это только true в объявлении параметра функции.
Вы можете использовать операторы индекса []
на указателях так же, как на массивах, поэтому P[i][j]
работает точно так, как вы ожидаете.
do 'void tisk_pole (char P [3] [3]) {' вместо этого. –