Объявляя инициализируемый массив, можно заставить С++ автоматически определять его размер. Для этого достаточно не указывать размер массива в объявлении. В этом случае компилятор определит отсутствующий размер, пересчитав поставляемые инициализаторы, и создаст массив требуемой длины. Например,
int nums [ ] = { 1, 2 , 3 , 4 } ;
создает массив с именем numsиз четырех элементов, которые содержат значения 1, 2, 3 и 4. Массив, при объявлении которого явным образом не указывается размер (как, например, массив nums), называют массивом неопределенной длины.
Такие массивы весьма полезны. Представьте себе, например, что вы, используя массивы с инициализацией, создаете таблицу Интернет-адресов:
char el[16] = "www.osborne.com";
char е2[16] = "www.weather.com";
char еЗ[15] = "www..amazon.com" ;
Очевидно, что считать вручную количество символов в каждом адресе, чтобы определить длину соответствующего массива, слишком хлопотно. Кроме того, такой способ чреват ошибками, если вы случайно ошибетесь в счете и зададите неправильную длину массива. Гораздо лучше переложить на компилятор вычисление длины этих массивов, как это показано ниже:
char el[] = "www.osborne.com";
char е2 [ ] = "www.weather.com";
char еЗ [ ] = "www.amazon.com" ;
Помимо того, что такой метод избавляет вас от утомительной работы, он хорош еще и тем, что вы можете изменить любой адрес и не думать о соответствующем изменении размера массива.
Инициализация массивов неопределенной длины не ограничивается одномерными массивами. Для многомерного массива вы можете указать все размеры, кроме самого левого, что даст возможность правильно индексировать массив. С помощью такого метода вы можете создавать таблицы переменной длины, и компилятор будет автоматически выделять под них требуемую память. В следующем примере sqrsобъявляется как массив неопределенной длины:
int sqrs[][2] = {
1,1,
2,4,
3,9,
4,16,
5,25,
6,36,
7,49,
8,64,
9,81,
10,100
};
Преимуществом такого объявления перед объявлением с явным указанием всех размеров массива является возможность удлинить или укоротить эту таблицу, не внося при этом изменений в размеры массива.
Особой формой двумерного массива является массив строк. Такие массивы широко используются в программировании. Например, внутренний обработчик базы данных может сравнивать команды пользователя с массивом строк допустимых команд. Для создания массивов строк используется двумерный символьный массив, в котором левый индекс характеризует число строк, а правый - их максимальную длину. Например, приведенное ниже объявление создает массив из 30 строк, каждая из которых может иметь длину до 80 символов:
char str_array[30][80];
Обратиться к индивидуальной строке этого массива не составляет труда: вы просто указываете один левый индекс. Например, приведенное ниже предложение вызывает функцию gets( ) для заполнения третьей строки в str_array:
gets(str_array[2]);
Чтобы получить доступ к индивидуальному символу в третьей строке, вы используете предложение вроде следующего:
cout << str_array[2] [3];
В результате на экран выводится четвертый символ третьей строки.
Приводимая ниже программа демонстрирует работу с массивом строк на примере очень простого компьютеризованного телефонного справочника. Двумерный массив numbers содержит пары имя-телефонный номер. Для определения телефонного номера вы вводите имя, на экран выводится соответствующий телефонный номер.
//Простой компьютеризованный телефонный справочник.
#include <iostream>
#include <cstdio>
using namespace std;
#include <conio>
int main(){
int i;
char str[80];
// Это массив из 10 строк, каждая из кото-
// рых может содержать до 79 символов.
char numbers [10] [ 80 ] = {
"Tom", "555-3322",
"Мэри", "555-8976",
"Джон", "555-1037",
"Рейчел", "555-1400",
"Sherry", "555-8873"
};
cout << "Введите имя: " ;
cin >> str;
for(i = 0; i < 10; i += 2)
if(!strcmp(str, numbers[i])) {
cout << "Телефон " << numbers [i + 1] << "\n";
break;
}
if(i == 10) cout << "He найдено.\n";
getch();
return 0;
}
Вот пример прогона программы:
Введите имя: Джон Телефон 555-1037
Обратите внимание на то, как выполняется наращивание управляющей переменной цикла for: в каждом шаге к ней прибавляется 2. Так делается потому, что в массиве чередуются имена и телефонные номера.