Массивы. Часть 2. Двумерные массивы. Массивы строк. Многомерные массивы

Массивы. Часть 2. Двумерные массивы. Массивы строк. Многомерные массивы

Данная тема есть продолжением темы «Понятие массива. Одномерные массивы».


Содержание


1. Двумерные массивы. Примеры описания и использования

В языке C++ существует возможность использовать двумерные и многомерные массивы. Двумерный массив – это список одномерных массивов.

Для доступа к элементам двумерного массива нужно указать два индекса. Если рассматривать массив как таблицу, тогда первый индекс определяет строку. Второй индекс определяет столбец таблицы.

Пример 1. Описание двумерного массива Matr целых чисел размером 3×4.

int Matr[3][4]; // двумерный массив размером 3*4

Доступ к элементам массива (рисунок 1):

Matr[0][0] = 23;
Matr[2][3] = 41;
Matr[1][2] = -8;

C++ матрица двумерная рисунокРисунок 1. Доступ к элементам матрицы Matr

Чтобы обнулить двумерный массив Matr нужно написать следующий код:

...

int Matr[3][4]; // двумерный массив размером 3*4
int i,j;

for (i=0; i<3; i++)
    for (j=0; j<4; j++)
        Matr[i][j] = 0;

...

Пример 2. Описание двумерной матрицы Matrix вещественных чисел размером 10×10.

float Matrix[10][10]; // матрица вещественных чисел размером 10*10

Доступ к элементам матрицы:

// доступ к элементам матрицы
Matrix[2][4] = -90.3453;
Matrix[0][8] = 259.3;
Matrix[9][9] = 0.85;
Matrix[3][4] = -0.23;

Пример обнуления матрицы Matrix:

// обнуление матрицы
for (i=0; i<10; i++)
    for (j=0; j<10; j++)
        Matrix[i][j] = 0.0;

2. Инициализация двумерных массивов. Пример

Инициализация двумерных и многомерных массивов подобна инициализации одномерных массивов. В этом случае список инициализаторов любой размерности берется в фигурные скобки.

Инициализация двумерных (многомерных) массивов может быть:

  • с указанием размера массива;
  • без указания размера массива («безразмерная» инициализация).

Пример 1. Инициализация двумерного массива M вещественных чисел размером 3×4. Устанавливается размер массива.

// инициализация массива M вещественных чисел размером 3*4
float M[3][4] = 
{
    {  0.5, -2.8, -1.0, 23.45 },
    { -2.3,  0.4, 10.5,  0.8  },
    { 12.5, 10.4,  5.4,  3.56 }
};

Если в перечне указать не все элементы группы, тогда недостающие элементы будут дополняться нулевыми значениями автоматически (рисунок 2).

// инициализация массива M вещественных чисел размером 3*4
// недостающие элементы дополняются нулями
float M[3][4] = 
{
    { 0.5, -2.8 },
    { -2.3 },
    { 12.5, 10.4, 5.4, 3.56 }
};

С++ массив заполнение рисунокРисунок 2. Дополнение массива нулями

Пример 2. «Безразмерная» инициализация массива B целых чисел.

// "безразмерная инициализация массива B
int B[][4] = 
{
    {  2, -8,   3,   4 },
    { -3, 50,  42, -77 },
    { 11, 25, -30,   4 }
};

Пример 3. «Безразмерная инициализация массива B с дополнением нулями (рисунок 3).

// "безразмерная инициализация массива B
// с дополнением нулями
int B[][4] = 
{
    { 2, -8 },
    { -3 },
    { 11, 25, -30, 4 }
};

C++ инициализация массива рисунокРисунок 3. «Безразмерная» инициализация массива B с заполнением нулями

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

3. Инициализация массивов строк. Примеры

Массив строк также есть двумерный массив символов.

Равно как и с другими типами данных, инициализация массива строк может быть:

  • с указанием размера строки;
  • без указания размера строки («безразмерная» инициализация).

Пример 1. Инициализация массива строк с указанием длины строки. Описывается двумерный массив строк размером 5×60 символов.

char Strings[5][60] = 
{
    "Text - 1",
    "Text - 2",
    "Text - 3",
    "Text - 4",
    "Text - 5"
};

В вышеприведенном примере каждая строка может содержать до 60 символов. Если длина строки меньше, чем 60, то значение других символов равно 0 (рисунок 4).

C++ двумерный массив строк
Рисунок 4. Представление двумерного массива строк в памяти компьютера

Пример 2. «Безразмерная» инициализация массива строк

char * Strings2[] = 
{
    "String number 1",
    "String #2",
    "Third string"
};

Вышеприведенный код можно записать по другому

char * Strings2[3] = 
{
    "String number 1",
    "String #2",
    "Third string"
};

При «безразмерной» инициализации массива строк не нужно «вручную» подсчитывать длину (количество символов) строки. Это осуществляется автоматически на этапе компиляции.

В вышеприведенном примере длина первой строки равна 16 символов (рисунок 5). Длина второй строки равна 10. Длина третьей строки равна 12 символов. В конце каждой строки следует нулевой символ ‘\0’.

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

C++ безразмерная инициализация рисунок

Рисунок 5. Представление строки при «безразмерной» инициализации

4. Многомерные массивы. Примеры описания и использования
// массив целых чисел размером 3*5*6
int MI[3][5][6];
MI[0][2][5] = 238;
MI[2][4][3] = -3994;

// массив вещественных чисел размером 4*6*2*3
float MF[4][6][2][3];
MF[0][0][0][0] = -394.32f;
MF[3][4][1][1] = 4.4f;
MF[1][5][0][2] = 0.0f;
MF[2][2][1][1] = 555.2437f;


5. Инициализация многомерных массивов. Пример
// инициализация массива M целых чисел размером 2*3*4
int M[2][3][4] = 
            {
                {
                    { 8, 3, -5, 2 },
                    { -3, 2, 8, 4 },
                    { 1, 0, 3, -9 }
                },
                {
                    { -2, 9, 5, 4 },
                    { 1, 0, 2, 5 },
                    { -8, 3, 4, 2 }
                }
            };


Связанные темы