Студопедия

Главная страница Случайная страница

Разделы сайта

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






Ход работы. Основные сведения о двумерных массивах в языке С++.Двумерный массив представляется в C++ как массив






Основные сведения о двумерных массивах в языке С++. Двумерный массив представляется в 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 ], где 1 (номер строки) и 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}};






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.