Урок 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]. Вот они:

M_g7_2
Константа 3 в следующих квадратных скобках говорит о том, что каждый из этих элементов состоит, в свою очередь, из трех элементов:

M_g7_2_2
Элементы, которые находятся в 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_g7_2_3

Таким образом, элементы трехмерного массива отображаются в линейной памяти одномерным массивом, доступ к элементам которого осуществляется путем использования индексированной переменной с тремя индексами. В данном случае элементы массива расположены в памяти в следующей последовательности: 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]; переприсваивает это значение второму элементу.

Для случая двухмерных массивов полная аналогия с матрицами устанавливается следующим образом: при описании массивов первая константа в квадратных скобках задает количество строк, а вторая – количество столбцов матрицы; для индексированной переменной первый индекс определяет номер столбца, а второй – номер строки, на пересечении которых находится элемент матрицы.

Для тех, кто предпочитает мыслить образами, можно предложить следующие сравнения. Одномерный массив  - это полка, на которой стоят элементы. Двумерный массив  - это прямоугольная таблица или одномерный массив одномерных массивов. Трехмерный массив - это ящик, в который помещены таблицы или двумерный массив двумерных массивов. Четырехмерный массив - это полка, на которой стоят ящики или одномерный массив трехмерных массивов, который в свою очередь является одномерным массивом двумерных массивов.

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов