Многомерные массивы

Инициализация

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

Int a[4] = {4, 5, 1}; // a[0] = 4, a[1] = 5, a[2] = 1

Когда список инициализаторов короче размера массива, остальные элементы инициализируются нулём. Неопределённые массивы автоматически инициализируются нулём, однако, открываются с неопределёнными значениями.

Массиву, объявленному с явным списком инициализаторов, но без задающего его размер выражения, даётся размер, соответствующий количеству инициализаторов:

Char la[] = {‘1‘, ‘r’, ‘g’};

Имя массива само по себе является адресом или значением указателя. Массивы и указатели почти идентичны в смысле их использования для доступа к памяти. Однако, существуют важные различия. Указатель – переменная, принимающая в качестве значения адрес. А имя массива является конкретным фиксированным адресом, который может пониматься как постоянный указатель. Когда объявляется массив, компилятор должен выделить базовый адрес и достаточный объём памяти для размещения всех элементов массива. Базовый адрес массива является начальным положением в памяти, где хранится массив; это адрес первого (с индексом 0) элемента массива. Рассмотрим следующее объявление:

Const int n = 100;

Int a[n], *p;

Пусть система назначила байты памяти 300, 304, 308, … , 696 в качестве адресов для хранения a[0], a[1], a[2], … , a[99] соответственно; при этом адрес 300 стал базовым адресом массива а. Две инструкции

p = a; и p = &a[0];

являются равнозначными и присваивают р значение 300. Арифметика указателей предлагает альтернативу индексированию массивов. Две инструкции:

p = a + 1; и p = &a[1];

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

sum = 0;

for (p = a; p < &a[n]; ++p)

sum += *p;

это равносильно

sum = 0;

for (i = 0; i < n; ++i)

sum += *(a + i);

Также как выражение *(a + i) равносильно a[i], выражение *(p + i) равносильно p[i].

Поскольку массив а является постоянным указателем, а не переменной, такие выражения как:

a = p ++a a += 2

недопустимы. Мы не можем изменить адрес а.

Массивы объявленные с двумя парами квадратных скобок – двумерные. Продолжая в том же духе, можно получить массивы более высокой размерности. С каждой новой парой квадратных скобок наращивается размерность массива.

Пример:

Int a [100];

Int b [3] [5];

Int c [6] [3] [5];

Любой k-мерный массив имеет размер по каждому из своих k-измерений. Пусть si представляет величину i-того измерения, тогда объявление массива выделит память для s1 ´ s2 ´ … ´ sk элементов. В приведённом примере b содержит 3 ´ 5 элементов, а с – 6 ´ 3 ´ 5 элементов. Начиная с базового адреса массива все элементы хранятся в памяти последовательно. Многомерный массив может быть инициализирован заключённым в фигурные скобки списком инициализаторов, причём каждый ряд инициализируется своим списком в фигурных скобках:

Int a [2] [3] = { {1, 2, 3} , {4, 5, 6} }; // то же, что {1, 2, 3, 4, 5, 6}