почему arr [] [5] нормально, а arr [5] [] не нормально?
Это связано с арифметикой указателя c.
Когда вы пишете arr[ ][5]
, компилятор знает, что arr
- это массив, с каждым элементом, например, массивом 5 int
. Поэтому он может делать что-то вроде arr++
, что в основном означает указатель на «следующий» массив 5 int
. Это возможно, потому что размер вторичного массива известен.
Когда вы пишете arr[5][ ]
, компиляция никогда не может определить размер вторичного массива, и поэтому он не может выполнять арифметические операции с указателями c как arr++
Как эта идея распространяется на большие измерения? Например, можете ли вы юридически определить трехмерный массив как arr [] [] [5]?
Нет, все размеры должны быть явными, кроме первого измерения.