Урок 7.2.1. Описание массивов
7.2.1. Описание массивов
Как и в большинстве других языков программирования, в Си под массивом понимается совокупность однородных данных, рассматриваемых как нечто единое. Математическими аналогами программистского понятия массив является, например, матрица, которая в программе задается в виде двухмерного массива, или вектор, задаваемый одномерным массивом. Массив – это такой объект программы, который характеризуется именем, размерностью, количеством элементов по каждому измерению и типом значений его элементов.
В программе на Си описание массивов осуществляется оператором, имеющим следующую общую форму записи:
<тип> <имя>[<размер1>][<размер2>]...[<размерN>]; |
где <тип> определяет тип элементов массива. Все элементы массива однородны и могут принимать значения одного из любого допустимого в Си типа данных, за исключением функций и файлов.
Чаще всего в качестве <тип> используются ключевые слова, такие, как int, float, char и другие ключевые слова и словосочетания, задающие основные и производные типы данных, например, указатели, структуры и т.д.; <имя> – это <идентификатор>, задающийся по усмотрению программиста и являющийся именем массива. Имя массива используется для доступа к элементам массива; <размер> определяет количество элементов массива по каждому измерению и записывается целой беззнаковой константой.
Количество конструкций [<размер>] определяет размерность массива. При описании одномерного массива указывается только <размер1>, двухмерного массива <размер1> и <размер2> и т.п. для многомерных массивов. Многомерные массивы рассматриваются в Си как одномерные, элементами которых могут быть любые объекты, в том числе и массивы.
Примеры описания массивов:
int v[120]; v – одномерный массив из 120-ти целых чисел;
float mt[7][9]; mt – двумерный массив из 63-х (7*9) чисел с плавающей точкой;
char str[25]; str – массив из 25-ти символов;
char *u[10]; u – массив указателей на объекты типа char;
int *pr[2][3]; pr – двухмерный массив из 6-ти указателей на целые данные;
int (*r)[5][6]; r – указатель на данные целого типа, сгруппированные в массивы 5*6;
обратите внимание, что r в данном случае не является массивом.
Доступ к элементу массива обеспечивается использованием имени массива, вслед за которым в квадратных скобках записываются координаты элемента (индексы) по соответствующим измерениям. Индексы однозначно определяют положение элемента в массиве.
Нижняя граница индекса по каждому измерению массива имеет значение 0, а верхняя имеет значение <размер1>. В качестве индекса выступают выражения, значения которых приводятся к целому типу. Рассмотрим фрагмент программы:
int vect[10]; int k; for(k = 0; k <= 9; k++) vect[k] = k*k; |
В этом фрагменте описан одномерный массив с именем vect, содержащий 10 элементов типа int, первый элемент массива имеет индекс 0, второй – 1, третий – 2 и т.д., последний элемент имеет индекс 9. Доступ к элементам массива осуществляется путем использования вышеописанной языковой конструкции vect[k], которая называется индексированной переменной, или переменной с индексом.
Здесь уместно обратить внимание на то, что сами по себе массивы представляют векторные данные, но индексированная переменная есть скаляр. В результате выполнения этого фрагмента элементу vect[0] будет присвоено значение 0, элементу vect[1] значение 1, vect[2] значение 4 и т.д., до последнего элемента массива vect[9], которому будет присвоено значение 81.
Рассмотрим, каким образом определяются координаты элементов в многомерных массивах. Многомерные массивы Си трактуются как одномерные массивы, элементами которых, в свою очередь, являются массивы.
С этой точки зрения препарируем следующее описание массива: int m[2][3][2]; .
Рассуждаем так: константа 2 в первых квадратных скобках определяет базовый одномерный массив m из двух элементов m[0] и m[1]. Вот они:
Константа 3 в следующих квадратных скобках говорит о том, что каждый из этих элементов состоит, в свою очередь, из трех элементов:
Элементы, которые находятся в m[0], это элементы m[0][0], m[0][1], m[0][2], а элементы, которые содержатся в m[1], это элементы m[1][0], m[1][1] и m[1][2]. Константа 2 в последних квадратных скобках говорит о том, что каждый из предыдущих элементов состоит, в свою очередь, из двух элементов типа int:
Таким образом, элементы трехмерного массива отображаются в линейной памяти одномерным массивом, доступ к элементам которого осуществляется путем использования индексированной переменной с тремя индексами. В данном случае элементы массива расположены в памяти в следующей последовательности: m[0][0][0], m[0][0][1], m[0][1][0], m[0][1][1], m[0][2][0], m[0][2][1], m[1][0][0], m[1][0][1], m[1][1][0], m[1][1][1], m[1][2][0], m[1][2][1]. Обратите внимание - чем дальше индекс от имени массива, тем "быстрее" он меняется и элементы массива попадут в память построчно из первого массива, а затем и из второго.
Чтобы обратиться к элементу n-мерного массива, нужно использовать индексированную переменную с n индексами, например, оператор m[1][2][1]=15; присваивает значение 15 последнему элементу рассмотренного массива, а оператор m[0][0][1]=m[1][2][1]; переприсваивает это значение второму элементу.
Для случая двухмерных массивов полная аналогия с матрицами устанавливается следующим образом: при описании массивов первая константа в квадратных скобках задает количество строк, а вторая – количество столбцов матрицы; для индексированной переменной первый индекс определяет номер столбца, а второй – номер строки, на пересечении которых находится элемент матрицы.
Для тех, кто предпочитает мыслить образами, можно предложить следующие сравнения. Одномерный массив - это полка, на которой стоят элементы. Двумерный массив - это прямоугольная таблица или одномерный массив одномерных массивов. Трехмерный массив - это ящик, в который помещены таблицы или двумерный массив двумерных массивов. Четырехмерный массив - это полка, на которой стоят ящики или одномерный массив трехмерных массивов, который в свою очередь является одномерным массивом двумерных массивов.
Оставить комментарий