Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Двумерные массивы (справка).doc
Скачиваний:
2
Добавлен:
17.08.2019
Размер:
144.38 Кб
Скачать

Двумерные массивы

Двумерный массив представляется в С++ как массив, состоящий из массивов. Для этого при описании в квадратных скобках указывается вторая размерность. Если массив определяется с помощью операторов описания, то обе его размерности долж­ны быть константами или константными выражениями, поскольку инструкции по выделению памяти формируются компилятором до выполнения программы. На­пример:

int а[3][5]: // Целочисленная матрица из 3 строк и 5 столбцов Массив хранится по строкам в непрерывной области памяти:

Строки массива ничем не отделены одна от другой, то есть прямоугольной матри­цей двумерный массив является только в нашем воображении. В памяти сначала располагается одномерный массив а[0], представляющий собой нулевую строку массива а, затем — массив а[1], представляющий собой первую строку массива а, и т. д. Количество элементов в каждом из этих массивов равно длине строки, то есть количеству столбцов в матрице. При просмотре массива от начала в первую очередь изменяется правый индекс (номер столбца).

Для доступа к отдельному элементу массива применяется конструкция вида a[i ][ j], где i (номер строки) и j (номер столбца) — выражения целочисленного типа. Каж­дый индекс может изменяться от 0 до значения соответствующей размерности, уменьшенной на единицу.

ВНИМАНИЕ -

Первый индекс всегда воспринимается как номер строки, второй — как номер столбца, не­зависимо от имени переменной.

Можно обратиться к элементу массива и другими способами: *(*(а + i) + j) или *(a[i] + j). Они приведены для лучшего понимания механизма индексации, по­скольку здесь в явном виде записаны те же действия, которые генерируются ком­пилятором при обычном обращении к массиву. Рассмотрим их подробнее.

Допустим, требуется обратиться к элементу, расположенному на пересечении вто­рой строки и третьего столбца — а[2][3]. Как и для одномерных массивов, имя массива а представляет собой константный указатель на начало массива. В дан­ном случае это массив, состоящий из трех массивов. Сначала требуется обратить­ся ко второй строке массива, то есть одномерному массиву а[2]. Для этого надо прибавить к адресу начала массива смещение, равное номеру строки, и выполнить разадресацию: *(а + 2). Напомним, что при сложении указателя с константой учи­тывается длина адресуемого элемента, поэтому на самом деле прибавляется число 2, умноженное на длину элемента, то есть 2 * (5 * sizeof( int)), поскольку элемен­том является строка, состоящая из 5 элементов типа int.

Далее требуется обратиться к третьему элементу полученного массива Для полу­чения его адреса опять применяется сложение указателя с константой 3 (на самом деле прибавляется 3 * sizeof(int)), а затем применяется операция разыменова­ния для получения значения элемента: *(*(а + 2) + 3).

При описании массива можно задать начальные значения его элементов. Их запи­сывают в фигурных скобках. Элементы массива инициализируются в порядке их расположения в памяти. Например, оператор

int а[3][5] = { 1, 2 1, 3, 5, 2, 3, 4, 5, 1, 1, 3, 2, 6, 1 }:

определяет матрицу со следующими значениями элементов:

1 2 1 3 5

2 3 4 5 1

1 3 2 6 1

Если количество значений в фигурных скобках превышает количество элементов в массиве, при компиляции будет выдано сообщение об ошибке. Если значений меньше, оставшиеся элементы массива инициализируются значением по умолча­нию (для основных типов это 0). Можно задавать начальные значения не для всех элементов массива. Для этого список значений констант для каждой строки за­ключается в дополнительные фигурные скобки. Вот, например, как заполнить еди­ницами нулевой и первый столбцы приведенного выше массива

int а[3][5] = {{1, 1}, {1, 1}, {1, 1}}: Остальные элементы массива обнуляются.

При явном задании хотя бы одного инициализирующего значения для каждой стро­ки количество строк массива можно не задавать; память будет выделена под столько строк, сколько серий значений в фигурных скобках указано в списке, например:

int а[][5] = {{1, 1, 7, 7, 7}, {1, 1, 0}, {1, 1, 2, 2, 2}}: