Почему при объявлении многомерного массива в C ++ нужно указывать размер только для вторых измерений? - PullRequest
0 голосов
/ 04 августа 2020

Например, почему arr [] [5] нормально, а arr [5] [] нет? Как эта идея распространяется на большие измерения? Например, не могли бы вы легально определить трехмерный массив как arr [] [] [5]? , поэтому я хотел бы услышать объяснение / пройтись по нему. Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

почему arr [] [5] нормально, а arr [5] [] не нормально?

Это связано с арифметикой указателя c.

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

Когда вы пишете arr[5][ ], компиляция никогда не может определить размер вторичного массива, и поэтому он не может выполнять арифметические операции с указателями c как arr++

Как эта идея распространяется на большие измерения? Например, можете ли вы юридически определить трехмерный массив как arr [] [] [5]?

Нет, все размеры должны быть явными, кроме первого измерения.

0 голосов
/ 04 августа 2020

почему arr [] [5] в порядке, а arr [5] [] не в порядке?

Потому что, если у вас есть «любое количество групп из 5 элементов», вы можете Поместите их все последовательно в память и точно знайте, куда идет каждая - первая группа из 5 вещей куда-то идет, затем следующая группа занимает 5 вещей, после этого, и так далее. Но если у вас есть «5 групп любого количества вещей», то вы не знаете заранее, где второй и последующим группам нужно go. Кроме того, у вас нет гарантии, что все группы будут одинакового размера, именно так должен работать массив rect angular.

...