char[][]
не является допустимым типом массива, поскольку у вас не может быть массивов неполного типа, а char[]
является неполным. Я знаю, что это сбивает с толку, потому что у вас действительно есть два типа массивов, так что вот еще один пример с той же проблемой: char a[3][]
. Массив a имеет длину 3 и тип элемента char[]
, но char[]
, опять же, неполон, и это неверно .
Когда у вас есть «многомерный массив», у вас действительно есть массив массивов. Например, typedef int U[3][5];
делает U массивом длины из 3 массивов длиной 5 дюймов и эквивалентен typedef int H[5]; typedef H U[3];
.
Причина, по которой вы можете опустить самое левое измерение с параметрами функции, заключается в том, что только с параметрами функции , типы массивов вида T[N]
преобразуются в T*
и N можно опустить, давая T[]
T*
. Это относится только к «самому верхнему» или «крайнему» уровню.
Итак, все эти объявления функций идентичны:
int f1(int a[3][5]);
int f2(int a[][5]);
int f3(int (*a)[5]);
typedef int T[5];
int f4(T a[3]);
int f5(T a[]);
int f6(T* a);
Конечно, вы можете удалить имя параметра a в любом из приведенных выше объявлений, не изменяя их.