Предположим, у вас есть где-то:
#define x 3
Как указывают другие, typedef int array [3][];
не будет компилироваться.Вы можете опустить только самый значимый (т.е. первый) элемент длины массива.
Но вы можете сказать:
typedef int array [][3];
Это означает, что array
массив int (пока не определенной длины) массива длиной 3.
Чтобы использовать его, необходимо указать длину.Вы можете сделать это с помощью инициализатора следующим образом:
array A = {{1,2,3,},{4,5,6}}; // A now has the dimensions [2][3]
Но вы НЕ МОЖЕТЕ сказать:
array A;
В этом случае первое измерение A
не являетсяуказан, поэтому компилятор не знает, сколько места для него выделено.
Обратите внимание, что также хорошо использовать этот тип array
в определении функции - поскольку массивы в определениях функций всегда преобразуются в указателиих первый элемент компилятором:
// these are all the same
void foo(array A);
void foo(int A[][3]);
void foo(int (*A)[3]); // this is the one the compiler will see
Обратите внимание, что в этом случае:
void foo(int A[10][3]);
Компилятор все еще видит
void foo(int (*A)[3]);
Итак, 10
часть A[10][3]
игнорируется.
В итоге:
typedef int array [3][]; // incomplete type, won't compile
typedef int array [][3]; // int array (of as-yet unspecified length)
// of length 3 arrays