Массивы в Си

Массив – это совокупность данных одного и того же типа, расположенных в памяти ЭВМ последовательно, непосредственно одно за другим. Каждый элемент массива имеет номер, или индекс, определяющий его место в массиве. Основными характеристиками массива являются: имя, размерность, тип его элементов.

В языке С существуют только одномерные массивы. Следует заметить, что двумерный массив представляет собой массив одномерных массивов. Трехмерный массив – массив двухмерных массивов и т.д. На практике часто используются одномерные и двумерные массивы.

Пример: int a [3][5][3], - элементы этого одномерного массива – 3 одномерных массива, элементы которых – 5 одномерных массивов.

<рез-е пам.>≡<идент. типа><идент.> [ [конст.] { [конст.] }]{,<идент.типа><идент.> [ [конст.] { [конст.] }]}.

Константа-это целое положительное число,которое задает количество значений индекса. Индекс меняется от 0 до <константа>-1.

Выбор отдельного компонента массива осуществляется указанием идентификатора массива, за которым в квадратных скобках следует константа или переменная. Допустимо также использование индексного выражения. Индексное выражение должно давать значения, лежащие в диапазоне, определяемом при описании массива.

В программе одному массиву может быть присвоено значение другого массива, если их базовые типы и типы индексов совпадают.

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

Очень распространенным классом задач обработки массивов является их сортировка. Обычно элементы массива сортируются в порядке неубывания или в порядке невозрастания.

Значения элементов массива хранятся в памяти ЭВМ последовательно, непосредственно одно за другим. Каждый элемент массива имеет номер, или индекс, определяющий его место в массиве.

Операция образования массива [ ] может быть использована при описании несколько раз. В этом случае массив называется многомерным. Например:

Mass[2][15];

Это двумерный массив или матрица. Первый размер в описании определяет количество строк, а второй – количество столбцов.

Элементы многомерных массивов располагаются в памяти ЭВМ таким образом, что наиболее быстро меняется значение самого последнего индекса, т.е. для рассмотренного примера:

Mass[0][0], Mass[0][1], …, Mass[0][14], Mass[1][0],…, Mass[1][14].

Количество оперативной памяти, занимаемой элементами многомерного массива, определяется произведением величин его размерностей на длину элемента массива(т.е. для данного примера 2*15=30 элементов всего). Во избежание ошибок не следует определять массивы, занимающие более одного сегмента оперативной памяти (более 64 кбайт).

Многомерные массивы представляют собой чистую абстракцию, поскольку память у ЭВМ одномерна, и многомерные массивы хранятся в ней в виде линейных последовательных значений.

Начальная инициализация.

<резер-е пам.> ≡ <идент. типа><идент.> [ [конст.] { [конст.] }][ =<значение> ] {,<идент.> [ [конст.] { [конст.] }][ =<значение> ]}.

<значение> = {<знач. эл. мас.> {, <знач. эл. мас.> } }.

Пример: int a[3][5][3] = {{{15, 1, 3}, {2, 3, 0}, …}, …}

int a[3][5][3] = {15, 1, 3, 2, 3, 0, …}, - допустима частичная инициализация, т.е. записать до 45 (в нашем примере) элементов, можно меньше, но не больше.

Массивы и указатели довольно тесно связаны между собой. Этот факт может быть подтвержден следующим тождеством:

x[i] == *(х + i).

Работа в языке С с указателями, несомненно, покрывает все возможности работы с массивами. Если использование массивов делает программу более читабельной, то использование указателей делает ее более компактной и эффективной.

Идентификатор массива имеет значение адреса и тип «указатель».

Если нам дан трехмерный массив float а[3][4][3] (действительного типа),то

*a ~ a[0]

*(a+1) ~ a[1] -тип указатель(т.е является адресом элемента

)

*(*a) ~ a[0][0] -тип указатель

*(*(*a)) ~ a[0][0][0] -действительный тип

a[i][j][k] ~ *(*(*(a+i)+j)+k)

Данный массив можно также инициализировать таким образом: float a[ ][4][3]
Т.е самая левая размерность многомерного массива может не указываться. Это объясняется тем, что первый индекс программа считает сама, как смещение относительно адреса а.
НО во второй и последующих квадратных скобках размерности указывать обязательно, т.к программа не сможет сформировать адрес, если не знает, из скольких элементов состоит массив массивов

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

int z[3][4], *р;

то после присвоения

p = z

следующие элементы будут эквивалентными:

р == &z[0][0]

р + 1 == &z[0][1]

р + 2 == &z[0][2]

Так как двумерный массив - это массив массивов, то можно исполь­зовать имена строк z[0], z[l], z[2], которые являются указателями на пер­вые элементы этих строк.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: