МАССИВЫ
Стр. 10 < оглавление > Как известно, массив - это конечная совокупность данных одного типа. Можно говорить о массивах целых чисел, массивов символов и.т.д. Мы можем даже определить масссив, элементы которого - массивы( массив массивов), определяя, таким образм, многомерные массивы. Любой массив в программе должен быть описан: после имени массива добаляют квадратные скобки [], внутри которых обычно стоит число, показывающее количество элементов массива. Например, запись int x[10]; определяет x как массив из 10 целых чисел. В случае многомерных массивов показывают столько пар скобок , какова размерность массива, а число внутри скобок показывает размер массива по данному измерению. Например, описание двумерного массива выглядит так: int a[2][5];. Такое описание можно трактовать как матрицу из 2 строк и 5 столбцов. Для обрщения к некоторому элементу массива указывают его имя и индекс, заключенный в квадратные скобки(для многомерног массива - несколько индексов , заключенные в отдельные квадратные скобки): a[1][3], x[i] a[0][k+2]. Индексы массива в Си всегда начинаются с 0, а не с 1, т.е. описание int x[5]; порождает элементы x[0], x[1], x[2], x[3], x[4], x[5]. Индекс может быть не только целой константой или целой переменной, но и любым выражением целого типа. Переменная с индексами в программе используется наравне с простой переменной (например, в операторе присваивания, в функциях ввода- вывода). Начальные значения массивам в языке Си могут быть присвоены при компиляции только в том случае, если они объявлены с классом памяти extern или static, например: static int
a[6]={5,0,4,-17,49,1}; static int matr[2][5] = {{3,4,0,1,2},{6,5,1,4,9}}; Матрица хранится в памяти построчно, т.е.
самый правый индекс в наборе индексов массива
меняется наиболее быстро. Пример 3.6
Следующяя программа (пример 3.7) позволяет в целочисленном массиве найти разность максимального и минимального элемента . Обратите внимание, что функция fmax при первом обращении к ней дает максимальный элемент массива, а при повторном вызове - минимальный, так как предварительно мы изменили знаки элементов на противоположные. Это изменение знаков учитывается при вызове функции printf. В языке Си отсутствует возможность динамически распределять память под массивы: надо при описании массива задать точно его размер. Но если тот же массив описывается еще раз в другой программе, размеры можно не указывать;достаточно после имени сохранить пару квадратных скобок, например int x[]. Если при вызове функции в качестве аргумента ей передается имя массива, то, в отличае от простых переменных, берется фактически адрес начала этого массива. Поэтому записи fmax(a, 10) и fmax(&a[0], 10) равносильны. Пример 3.7
В следующем пример 3.8 массив описан как внешний. Функция main подсчитывает наибольшее число одинаковых идущих подряд элементов массива, определенного вне функции main. Пример 3.8
Если, как в данном
примере, размер массива пропущен, то транслятор
определит его дляну, считая присваиваемые
значения во время начальной инициализации.
Условная операция (k>max)?k:max в
операторе printf предусмотрена для того
частного случая, когда весь массив состоит из
одинаковых элементов. Приведем несколько
примеров, в которых ведется обработка двумерных
массивов. Но прежде одну полезную возможносить
языка Си. Речь идет о препроцессорном
утверждении #difine, позволяющем
присваивать символические имена константам. В
общем случае это утверждение записывают так: #define
строка1 строка2 (точка с запятой не ставится).
Пример 3.9
В программе
(пример 4.0) определяется минимальный элемент
кажой строки матрицы и выполняется обмен местами
найденого и диагональю этой же строки. Пример 4.0
|