Урок 7.2.2. Инициализация массивов

7.2.2. Инициализация массивов

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

int num[8]={1,3,5,7,9,11,13,9}; .

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

num[0]=1; num[1]=3;   num[2]=5;   num[3]=7;
num[4]=9; num[5]=11; num[6]=13; num[7]=9;

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

int num[]={1,3,5,7,9,11,13,9};

Приведем еще несколько примеров инициализации массивов:

float vector[4]={1.2,34.57,81.9,100.77}; – здесь все ясно;

int digit[5]={1,2,3}; – недостающие при инициализации значения принимаются равными нулю (для массивов char равными нуль-символу );

char chr[7]={'A','Б','В','Г','Д'}; -  первые пять элементов массива приняли значение соответствующих элементов списка инициализации, а последние два элемента – значение нуль-символа;

float const mt[4]={25,26,17,18}; – инициализация массива констант типа float.

Рассмотрим, как инициализируются многомерные массивы.

//Инициализация матрицы:
int mat[3][3] = {
                  {1,2,3},
                  {4,5,6},
                  {7,8,9}
                };

Инициализация матрицы происходит по строкам в порядке запоминания элементов в памяти и в данном случае элемент матрицы, например mat[2][1] получит значение 8. При инициализации данного массива, значения элементов каждой строки матрицы заключены в фигурные скобки, что отражает сущность выражения многомерных массивов через одномерные.

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

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

Если в списке значений больше, чем элементов массива, то такая запись считается ошибочной. Все вышеуказанное справедливо для массива любой размерности. При инициализации многомерных массивов, необходимо учитывать, что чем правее индекс, тем "быстрее" он изменяется, – это следует из рассмотренного способа распределения памяти для массивов.

//Инициализация двухмерного массива символов:
char chr[3][5] = {
                   {'A','Б','В','Г','Д'},
                   {'а','б','в','г','д'},
                   {'A','B','C','D','E'}
                  };
//Три равносильных способа инициализации трехмерного массива:
int p[3][2][3] = {
                   { {1,  2,  3},
                     {4,  5,  6}
                   },
                   { { 7,  8,  9},
                     {10, 11, 12}
                   },
                   { {13, 14, 15},
                     {16, 17, 18}
                    }
                  };
 
int p[3][2][3] = {
                    { 1,   2,  3,  4,  5,  6},
                    { 7,   8,  9, 10, 11, 12},
                    {13,  14, 15, 16, 17, 18}
                 };
 
int p[3][2][3] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18};
 
//если мы "забудем" в первой строчке 2 числа:
int p[3][2][3] = {
                    { 1,   2,  3,  4},
                    { 7,   8,  9, 10, 11, 12},
                    {13,  14, 15, 16, 17, 18}
                 };
//то эквивалентное объявление "в одну строчку" будет следующим:
int p[3][2][3] = {1,2,3,4,0,0,7,8,9,10,11,12,13,14,15,16,17,18};

Динамическое создание массивов. Динамическое создание (выделение памяти под хранение) одномерных массивов рассматривалось в разделе 7.1.5. Инициализация указателей. Сейчас рассмотрим как создать двумерный массив в динамической памяти. Двумерный динамический массив может быть создан как массив указателей на массивы строк, при этом память, как под массив указателей, так и под массивы строк должна быть выделена динамически.

Пример для языка С:

int N = 3; //число строк
int M = 4; //число столбцов
int **A = (int **)malloc(N*sizeof(int *));
for(int i = 0; i < N; i++) 
{
    A[i] = (int *)malloc(M*sizeof(int));
}

Пример для языка С++:

int n = 3; //число строк
int m = 4; //число столбцов
int **a; //указатель на указатель на данные типа int (будет указывать на массив)
//Динамическое выделение памяти под матрицу:
a = new int* [n]; //1.создаём массив указателей на указатели на данные типа int
//2. теперь выделяем память (построчно) собственно под матрицу
for(i = 0; i < n; i++)
    a[i] = new int[m];
 
// Освобождение динамической памяти:
//1. вначале освободим память, отведённую собственно под матрицу, т.е. под данные
for(i = 0; i < n; i++)
    delete [] a[i];
delete [] a; //2. теперь освобождаем память, занятую массивом указателей на строки

Как видим, вначале выделяется память под массив указателей, затем под данные. Освобождение памяти делается в обратном порядке: вначале освобождают память, занятую данными матрицы, а затем — массивом указателей.

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

Как эти действия можно оформить в виде функций см. в разделе 9.4.6. Массивы в качестве аргументов.

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов