Выбрать главу

 {7, 49},

 {8, 64},

 {9, 81},

 {10, 100}

};

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

В следующей программе массив sqrs используется для поиска квадрата числа, введенного пользователем. Программа сначала выполняет поиск заданного числа в массиве, а затем выводит соответствующее ему значение квадрата.

#include <iostream>

using namespace std;

int sqrs[10][2] = {

 {1, 1},

 {2, 4},

 {3, 9},

 {4, 16},

 {5, 25},

 {6, 36},

 {7, 49},

 {8, 64},

 {9, 81},

 {10, 100}

};

int main()

{

 int i, j;

 cout << "Введите число от 1 до 10: ";

  cin >> i;

 // Поиск значения i.

 for(j=0; j<10; j++)

  if(sqrs[j][0]==i) break;

 cout << "Квадрат числа " << i << " равен ";

 cout << sqrs[j][1];

 return 0;

}

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

#include <iostream>

#include <cstring>

using namespace std;

void f1();

int main()

{

 f1();

 f1();

 return 0;

}

void f1()

{

 char s[80]="Этo просто тест\n";

 cout << s;

 strcpy(s, "ИЗМЕНЕНО\n"); // Изменяем значение строки s.

 cout << s;

}

При выполнении этой программы получаем такие результаты.

Это просто тест

ИЗМЕНЕНО

Это просто тест

ИЗМЕНЕНО

В этой программе массив s инициализируется при каждом вызове функции f1(). Тот факт, что при ее выполнении массив s изменяется, никак не влияет на его повторную инициализацию при последующих вызовах функции f1(). Поэтому при каждом входе в нее на экране отображается следующий текст.

Это просто тест

"Безразмерная" инициализация массивов

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

char e1[14] = "Деление на 0\n";

char е2[23] = "Конец файла\n";

char еЗ[21] = "В доступе отказано\п";

Нетрудно предположить, что вручную неудобно подсчитывать символы в каждом сообщении, чтобы определить корректный размер массива. К счастью, в C++ предусмотрена возможность автоматического определения длины массивов путем использования их "безразмерного" формата. Если в инструкции инициализации массива не указан его размер, C++ автоматически создаст массив, размер которого будет достаточным для хранения всех значений инициализаторов. При таком подходе предыдущий вариант инициализации массивов для построения таблицы сообщений об ошибках можно переписать так.

char е1[] = "Деление на 0\n";

char е2[] = "Конец файла\n";

char еЗ[] = "В доступе отказано\n";

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

"Безразмерная" инициализация массивов не ограничивается одномерными массивами. При инициализации многомерных массивов вам необходимо указать все данные, за исключением крайней слева размерности, чтобы С++-компилятор мог должным образом индексировать массив. Используя "безразмерную" инициализацию массивов, можно создавать таблицы различной длины, позволяя компилятору автоматически выделять область памяти, достаточную для их хранения.