Как известно, массив
- это конечная совокупность данных одного
типа. Можно говорить о массивах целых чисел,
массивов символов и.т.д. Мы можем даже определить
масссив, элементы которого - массивы( массив
массивов), определяя, таким образм, многомерные
массивы. Любой массив в программе должен быть
описан: после имени массива добаляют квадратные
скобки [], внутри которых обычно стоит
число, показывающее количество элементов
массива. Например, запись 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
|