Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Двумерные массивы. Двумерный массив представляется в C++ как массив, состоящий из массивов



Читайте также:
  1. RAID-массивы и матрицы
  2. Двумерные массивы
  3. Двумерные массивы
  4. Двумерные массивы
  5. Двумерные массивы
  6. ДВУМЕРНЫЕ МАССИВЫ

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

int a[3][5]; // Целочисленная матрица из 3 строк и 5 столбцов

Массив хранится по строкам в непрерывной области памяти:

а00 а01 а02 а03 а04 а10 а11 а12 а13 а14 а20 а21 а22 а23 а24

| --- 0-я строка -- | --- 1-я строка -- | --- 2-я строка -- |

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

Для доступа к отдельному элементу массива применяется конструкция вида а[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}};


Дата добавления: 2015-07-11; просмотров: 112 | Нарушение авторских прав






mybiblioteka.su - 2015-2024 год. (0.007 сек.)