Подтвердить что ты не робот

Инициализация многомерных массивов

Сегодня я видел вопрос на экзамене С++:

Учитывая массив int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}, , каково значение Multi[1][1][0] ?

Не следует ли инициализировать трехмерные массивы следующим образом: {{{},{}},{{},{}},{{},{}}}? Как я могу найти значение элемента с такими индексами? Это так запутанно.

4b9b3361

Ответ 1

Вы можете инициализировать массивы в обоих направлениях. Использование фигурных внутренних фигурных скобок необязательно, но рекомендуется, чтобы они улучшали читаемость.

Самый простой способ найти значение элемента неформатированного многогранного массива с фигурными скобками - это разбиение массива. Например, размеры вашего массива равны 2x3x2:

Сначала разделите массив на 2 наборы ( 2 x3x2)

{14,11,13,10,9,6,8,7,1,5,4,2} --> {{14,11,13,10,9,6}, {8,7,1,5,4,2}}

Затем разделите каждую часть на 3 наборы (2x 3 x2)

{{14,11,13,10,9,6},{8,7,1,5,4,2}} --> {{{14,11}, {13,10} ,{9,6}}, {{8,7}, {1,5}, {4,2}}}

Теперь, как вы видите, в каждом меньшем наборе (2x3x 2) осталось 2, поэтому вы отформатировали свой массив с фигурными скобками.

Теперь проще найти значение элемента с индексом [1][1][0]. Этот элемент является вторым ([ 1] [1] [0]) большим множеством 2-й ([1] [ 1] [0]) меньший набор 1-й ([1 ] [1] [ 0]), поэтому ответ 1.

Ответ 2

Правильный ответ, который должен дать полный балл, будет: компилировать код со всеми включенными предупреждениями, и вы не закончите писать дрянной код, подобный этому.

gcc test.c -std=c11 -pedantic-errors -Wall -Wextra
test.c: In function 'main':
test.c:6:3: warning: missing braces around initializer [-Wmissing-braces]
   int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2};
   ^

Однако я подозреваю, что ваш учитель не так сильно обеспокоен тем, что код дерьмовый, но скорее ищет детали на языке C, которые позволяют инициализировать массивы (и структуры), даже если список скобок не совпадает структура инициализации.

Что касается языка C, int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2} полностью эквивалентен:

// properly written initialization list for a 3D array
int Multi[2][3][2] = 
{ 
  {
    {14, 11},
    {13, 10},
    { 9,  6}
  },
  {
    { 8,  7},
    { 1,  5},
    { 4,  2}
  }
};

Единственное обоснование того, почему разрешена первая форма, заключается в том, что она позволяет писать такие вещи, как

int Multi[2][3][2] = {0};

который явно инициализирует первый элемент равным 0 и остальным элементам, как если бы они имели статическую продолжительность хранения (0 также). Значение всех элементов будет установлено равным нулю.

Написание таких вещей, как int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}, злоупотребляет языком C. Это очень плохая практика. Это запрещено MISRA-C и т.д.

Хороший учитель будет заботиться о том, чтобы научить вас, как включать все предупреждения компилятора и как правильно инициализировать многомерные массивы, а не позволять вам интерпретировать запутанный бессмысленный код.

Ответ 3

int Multi [2] [3] [2] = {14,11,13,10,9,6,8,7,1,5,4,2};

карта памяти Multi [2] [3] [2] - →

Многоканальный [0] [0] [0] = 14;

Многоканальный [0] [0] [1] = 11;

Многоканальный [0] [1] [0] = 13;

Многоканальный [0] [1] [1] = 10;

Многоканальный [0] [2] [0] = 9;

Многоканальный [0] [2] [1] = 6;

Многоканальный [1] [0] [0] = 8;

Многоканальный [1] [0] [1] = 7;

Многоканальный [1] [1] [0] = 1;

Многоканальный [1] [1] [1] = 5;

Многоканальный [1] [2] [0] = 42;

Многоканальный [1] [2] [1] = 2;

поэтому значение Multi [1] [1] [0] = 1; это так просто

и мы также можем инициализировать это как

int Multi [2] [3] [2] = {{{14,11}, {13,10}, {9,6}}, {{8,7}, {1,5}, { 4,2}}};