Запутанное определение многомерных массивов в C Primer

#c #arrays

Вопрос:

В книге приведен следующий пример:

 int arr[10][20][30] = {0}; // initialize all elements to 0
 

Мое текущее понимание: это один массив размером 10, содержащий 10 элементов, все из которых сами являются массивами, размером 20, содержащий 20 элементов, все из которых сами являются массивами, размером 30, содержащий 30 элементов, все из которых являются int .

Так, как об этом говорится в книге:

Сначала мы видим, что arr это массив размером 10. Элементы этого массива сами по себе являются массивами размером 20. Каждый из этих массивов содержит 30 элементов типа int .

Нет: каждый из этих 20 элементов представляет собой массивы размером 30, состоящие из 30 элементов типа int .

У меня ужасное понимание текста или книга неправильная?

Комментарии:

1. Ваше понимание и то, как об этом говорится в книге, говорят мне об одном и том же.

2. Я, очевидно, переосмысливаю это, но мне нужно быть несколько критичным, чтобы понять это самостоятельно, а массивы размером 20 не могут вместить 30 элементов, не так ли?

3. @sanzio массивы размером 20 не подходят для 30 элементов. Каждый элемент в массиве размером 20 сам по себе является массивом размером 30.

Ответ №1:

У меня ужасное понимание текста или книга неправильная?

В книге, кажется, сказано то, что в вашей цитате.

На мой взгляд, это плохо сформулировано.

Не размышляя о намерениях авторов, это, возможно, можно было бы более четко сформулировать как:

Сначала мы видим, что arr это массив размером 10. Элементы этого массива сами по себе являются массивами размером 20. Каждый элемент этого массива представляет собой массив из 30 элементов, которые имеют тип int .

Ответ №2:

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

Учесть следующее:

int arr[2][3][4] = {0}; // initialize all elements to 0

Здесь мы начинаем с массива размером 2. Каждый из этих двух элементов является массивом размером 3. Каждый из этих трех элементов является массивом размером 4. Каждый из этих 4 элементов является int.

 arr -> [0] -> [0] -> [0] int
    |      |      -> [1] int
    |      |      -> [2] int
    |      |      -> [3] int
    |      -> [1] -> [0] int
    |      |      -> [1] int
    |      |      -> [2] int
    |      |      -> [3] int
    |      -> [2] -> [0] int
    |             -> [1] int
    |             -> [2] int
    |             -> [3] int
    -> [1] -> [0] -> [0] int
           |      -> [1] int
           |      -> [2] int
           |      -> [3] int
           -> [1] -> [0] int
           |      -> [1] int
           |      -> [2] int
           |      -> [3] int
           -> [2] -> [0] int
                  -> [1] int
                  -> [2] int
                  -> [3] int
 

Это гораздо меньший массив массивов массивов, чем в вашем примере, но, как вы можете видеть, это все еще довольно большое количество элементов в целом.

Вы все равно должны индексировать каждый массив, пока не перейдете на третий уровень. Таким образом, минимальным элементом будут arr[0][0][0] и такие назначения, arr[0][0][0] = 5 которые являются допустимыми. Следовательно, максимальный элемент будет arr[1][2][3] в моем примере. Следуйте дереву, которое я нарисовал выше, чтобы увидеть, как вы будете обращаться к каждому элементу.

Ответ №3:

чтобы сделать понятным понимание по этим схемам

2d массив — это набор 1d массивов и 3d массив как набор 2d array

как и в приведенном выше примере, вы понимаете, что если массив размером n, созданный как int array[n] массив, должен содержать n элементов в строке, точно так же, как это, если существует 2d-массив, int array[n][m] это означает, что при настройке 2d-массива у вас есть n элементов в m строк

в 1-м массиве мы получили n элементов только для одной строки/вектора, тогда как в 2-м массиве эти строки

когда вы поймете все вышесказанное, вам будет легче понять 3d array , как я сказал, понять 3d array как коллекцию 2d array , например, наиболее распространенной визуализацией будет куб

в кубе мы получили стопку 2d-массивов,которые соединились вместе,чтобы сделать его трехмерным,как в цифровом изображении rgb,для всех отдельных 3 каналов зеленого, красного, синего мы получили соответствующие значения интенсивности в плоскости x, y или (m, n) положение матрицы

в родном программировании c /c int array[a][b][c] или int ***array и то,и другое создает 3d-массив для простоты рассмотрим 1-й и рассмотрим как c нет элементов, расположенных на плоскости a*b или (a, b) матрице c раз, когда я не знаю, это становится более понятным и понятным для вас или становится сложным

на всякий случай, если вы не понимаете, сравните это в сценарии реальной жизни, рассмотрим 2d-массив как: список мест на стадионе/в классе есть n мест, которые повторяются m раз или строк, рассмотрим 3d-массив как: все места в школьном здании/ (места с низким потолком места на балконе), так как все места в 2d-массиве теперь рассматриваются в одном списке/одном объекте, т. е. 3d-массив

Комментарии:

1. Каждый отдельный адрес массива at int array[a][b][c] -это int *** но int array[a][b][c] != int *** .

2. int ***array это также не способ создания 3D-массива. Это строго тройной указатель без какого-либо дополнительного контекста. На самом деле, самостоятельно вам потребуется несколько уровней malloc «s», чтобы он вел себя как массив.