Массивы с неопределенным размером (безразмерные массивы)

Строки

В языке C++ не существует особого встроенного типа данных для работы с текстом,. Текст представляется в виде последо­вательности символов (байтов), заканчивающихся нулевым символом (нуль-символом) '\0', представляющим нулевое числовое значение. Иногда такое представление называют C-строками, поскольку оно появилось в языке C.

C-строки представляются в виде одномерного массива символов, например:

char str[20];

Для записи строковых констант (лите­ралов) в программе используются последовательности символов, заключенные в двойные ка­вычки:

"This is a string"

"0123456789"

"*"

Строка, как и любой другой массив, может быть инициализирована поэлементно. Например, чтобы записать в str строковое значение "Hello!", можно выполнить соответствующее число присваиваний (не забыв о завершающем нуль-символе), циклически ввести необходимые символы с клавиатуры или использовать список начальных значений. В результате указанных действий в массиве string будет записана строка "Hello!", при этом фактически будет использоваться только 7 из 20 элементов массива.

Однако для строк возможна и более короткая форма записи инициализации:

char string[20]="Hello!";

вывода текущего значения строки:

cout << str;

а также ввода новых строковых значений:

cin >> str;

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

При указании размера массива символов следует помнить, что он должен быть на 1 больше, чем число символов в строке, чтобы предусмотреть место для нуль-символа.

В отдельных случаях допускается объявление массива с неопределенным числом элементов (“пустыми” квадратными скобками). Один из таких немногих случаев – при инициализации массива с использованием списка начальных значений. При таком объявлении размер “безразмерного” массива определяется числом элементов в списке:

int days[] = { 31, 28, 31, 30, 31, 31, 30, 31, 30, 31, 30, 31};

// Автоматическое определение размера массива

Данное объявление объявляет и инициализирует массив days из 12 элементов, то есть с размером 12.

Допускается подобное использование “безразмерных” многомерных массивов. При такой, “списковой” инициализации можно не задавать размер только первого (самого левого) измерения массива. Например, объявление массива temp можно переписать так:

double temp[][3] = { { 3.2, 3.3, 3.4}, { 4.1, 3.9, 3.9} };

(размерностью массива temp будет 2 на 3).

Безразмерные массивы типа char можно инициализировать c помощью строковых констант (литералов):

char digits[] = "0123456789";

Размер массива digits явно не задан, он определяется исходя из размера инициализирующего его литерала, в данном случае 11 (10 символов плюс нулевой символ).

Данное объявление можно рассматривать как краткую форму записи объявления

char digits[] = {'0','1','2','3','4','5','6','7','8','9','\0'};