Массив структур
Массив структур – это массив, каждый элемент которого является структурой. В памяти элементы массива структур размещаются последовательно.
Массивы структур широко используются для структурной организации данных в прикладных программах и системном программном обеспечении.
Из элементов структурного типа можно организовать массивы также как из элементов стандартного типа. Для объявления массива структур следует сначала определить структуру, а затем объявить массив переменных данного типа. Как и массивы переменных, массивы структур индексируются с нуля.
Объявление массива
Объявление массива имеет следующий синтаксис: <спецификация типа> <имя> [<константное выражение>];<спецификация типа> <имя> [ ];
Здесь квадратные скобки являются элементом синтаксиса, а не признаком необязательности конструкции.
Объявление массива может иметь одну из двух синтаксических форм, указанных выше. Квадратные скобки, следующие за именем, – признак того, что переменная является массивом. Константное выражение, заключенное в квадратные скобки определяет число элементов в массиве. Индексация элементов массива в языке C++ начинается с нуля. Таким образом, последний элемент массива имеет индекс на единицу меньше, чем число элементов массива.
Во второй синтаксической форме константное выражение в квадратных скобках опущено. Эта форма может быть использована, если в объявлении массива присутствует инициализатор, либо массив объявляется как формальный параметр функции, либо данное объявление является ссылкой на объявление массива где-то в другом месте программы. Однако для многомерного массива может быть опущена только первая размерность.
Многомерный массив, или массив массивов, объявляется путем задания последовательности константных выражений в квадратных скобках, следующей за именем: <спецификация типа> <имя> [<константное выражение>][<константное выражение>] … ;
Каждое константное выражение определяет количество элементов в данном измерении массива, поэтому объявление двумерного массива содержит два константных выражение, трехмерного – три и т.д.
Массив может состоять из элементов любого типа, кроме типа void и функций, т.е. элементы массива могут иметь базовый, перечислимый, структурный тип, быть объединением, указателем или массивом.
Примеры объявлений массивов
1 2 3 4 |
int x[10]; // Одномерный массив из 10 целых чисел. Индексы меняются от 0 до 9. double y[2][10]; // Двумерный массив вещественных чисел из 2 строк и 10 столбцов. |
Инициализация массивов
Как и простые переменные, массивы могут быть инициализированы при объявлении. Инициализатор для объектов составных типов (каким является массив) состоит из списка инициализаторов, разделенных запятыми и заключенных в фигурные скобки. Каждый инициализатор в списке представляет собой либо константу соответствующего типа, либо, в свою очередь, список инициализаторов. Эта конструкция используется для инициализации многомерных массивов.
Наличие списка инициализаторов в объявлении массива позволяет не указывать число элементов по его первой размерности. В этом случае количество элементов в списке инициализаторов и определяет число элементов по первой размерности массива. Тем самым определяется размер памяти, необходимой для хранения массива. Число элементов по остальным размерностям массива, кроме первой, указывать обязательно.
Если в списке инициализаторов меньше элементов, чем в массиве, то оставшиеся элементы неявно инициализируются нулевыми значениями. Если же число инициализаторов больше, чем требуется, то выдается сообщение об ошибке.
Примеры инициализации массивов
1 2 3 4 5 6 7 8 9 10 |
int a[3] = {0, 1, 2}; // Число инициализаторов равно числу элементов double b[5] = {0.1, 0.2, 0.3}; // Число инициализаторов меньше числа элементов int c[ ] = {1, 2, 4, 8, 16}; // Число элементов массива определяется по числу инициализаторов int d[2][3] = {{0, 1, 2}, {3, 4, 5}} // Инициализация двумерного массива. Массив состоит из двух строк, // в каждой из которых по 3 элемента. Элементы первой строки // получают значения 0, 1 и 2, а второй – значения 3, 4 и 5. int e[3] = {0, 1, 2, 3}; // Ошибка – число инициализаторов больше числа элементов |
Обратите внимание, что не существует присваивания массиву, соответствующего описанному выше способу инициализации.
1 2 3 4 |
int a[3] = {0, 1, 2}; // Объявление и инициализация a = {0, 1, 2}; // Ошибка |