Массив a1
имеет размерность 3; массивы а2
и a3
— размерности 4. Определение массива a4
ошибочно. Хотя литерал содержит только шесть явных символов, массив a4
должен иметь по крайней мере семь элементов, т.е. шесть для самого литерала и один для нулевого символа.
Нельзя инициализировать массив как копию другого массива, не допустимо также присвоение одного массива другому.
int a[] = {0, 1, 2}; //
int a2[] = a; //
//
а2 = a; //
Некоторые компиляторы допускают присвоение массивов при применении
Как и векторы, массивы способны содержать объекты большинства типов. Например, может быть массив указателей. Поскольку массив — это объект, можно определять и указатели, и ссылки на массивы. Определение массива, содержащего указатели, довольно просто, определение указателя или ссылки на массив немного сложней.
int *ptrs[10]; //
int &refs[10] = /* ? */; //
int (*Parray)[10] = &arr //
int (&arrRef)[10] = arr; //
Обычно модификаторы типа читают справа налево. Читаем определение ptrs
справа налево (см. раздел 2.3.3): определить массив размером 10 по имени ptrs
для хранения указателей на тип int
.
Определение Parray
также стоит читать справа налево. Поскольку размерность массива следует за объявляемым именем, объявление массива может быть легче читать изнутри наружу, а не справа налево. Так намного проще понять тип Parray
. Объявление начинается с круглых скобок вокруг части *Parray
, означающей, что Parray
— указатель. Глядя направо, можно заметить, что указатель Parray
указывает на массив размером 10. Глядя влево, можно заметить, что элементами этого массива являются целые числа. Таким образом, Parray
— это указатель на массив из десяти целых чисел. Точно так же часть (&arrRef
) означает, что arrRef
— это ссылка, а типом, на который она ссылается, является массив размером 10, хранящий элементы типа int
.
Конечно, нет никаких ограничений на количество применяемых модификаторов типа.
int *(&arry)[10]=ptrs; //
Читая это объявление изнутри наружу, можно заметить, что arry
— это ссылка. Глядя направо, можно заметить, что объект, на который ссылается arry
, является массивом размером 10. Глядя влево, можно заметить, что типом элемента является указатель на тип int
. Таким образом, arry
— это ссылка на массив десяти указателей.
Зачастую объявление массива может быть проще понять, начав его чтение с имени массива и продолжив его изнутри наружу.
Упражнение 3.27. Предположим, что функция txt_size()
на получает никаких аргументов и возвращают значение типа int
. Объясните, какие из следующих определений недопустимы и почему?
unsigned buf_size = 1024;
(a) int ia[buf_size]; (b) int ia[4 * 7 - 14];
(c) int ia[txt_size()]; (d) char st[11] = "fundamental";
Упражнение 3.28. Какие значения содержатся в следующих массивах?
string sa[10];
int ia[10];
int main() {
string sa2[10];
int ia2[10];
}
Упражнение 3.29. Перечислите некоторые из недостатков использования массива вместо вектора.
Подобно библиотечным типам vector
и string
, для доступа к элементам массива можно использовать серийный оператор for
или []
) (subscript). Как обычно, индексы начинаются с 0. Для массива из десяти элементов используются индексы от 0 до 9, а не от 1 до 10.