Двумерные массивы
Массив - это совокупность элементов одного типа, расположенных в памяти вплотную друг за другом. Каждый массив имеет имя. Массивы могут состоять из арифметических данных, символов, строк, структур, указателей файлов. Доступ к отдельным элементам массива осуществляется по имени массива и индексу (порядковому номеру) элемента.
При объявлении массива в программе определяется имя массива, тип его элементов, размерность и размер. Размерность или количество измерений массива определяется количеством индексов при обращении к элементам массива. Массивы бывают одномерные, двухмерные, трехмерные и т.д. .
Размер массива - это количество его элементов.
Общий вид объявления массива:
<имя_типа> <имя_массива> [k1] [k2] … [kn] ;
где k1, k2, …, kn - количество элементов массива - константы или константные выражения по 1, 2, …, n измерениям. Причем значения индексов могут изменяться от 0 до ki-1.
Примеры объявления массивов:
) int C[10] [20] [15]; //трёхмерный целочисленный массив
Примеры обращение к элементам:
float B[5] [20]; //двумерный вещественный массив из 50 строк и 20 столбцов.
Примеры обращения к его элементам :
B[0] [0], B[0] [1] ,.., B[i] [j], …, B[4] [19], …
C[i] [j] [k], ..., C[2*i] [0] [3*k+1], …
При работе с массивами надо пользоваться следующими правилами:
Современные трансляторы языка Си не контролируют допустимость значений индексов. Это должен делать программист.
Кол-во измерений массива не ограничено.
В памяти элементы массива располагаются так, что при переходе от элемента к элементу наиболее быстро меняется самый правый индекс массива, т.е. матрица, например, располагается в памяти по строкам.
Операций над массивами в Си нет, поэтому пересылка элементов одного массива в другой может быть реализована только поэлементно с помощью цикла.
Над элементами массива допускаются те же операции что и над простыми переменными того же типа.
Ввод-вывод значений элементов массива можно производить только поэлементно.
Начальные значения элементам массива можно присвоить при объявлении массива.
Например:
1) int a[10]={1,2,3,4,5,6,7,8,9,10};
2) int c[ ]={-1,2,0,-4,5,-3,-5,-6,1};
Если размер одномерного массива не указан (даны только по [ ] ), то размер определяется количеством инициированных значений, т.е. кол-вом значений в { }
3) int w[3] [4] ={{1,2,3,4}, // элем. 0-ой строки
{-3,2,-1,1}, // эл-ты 1-ой строки
2,10,1,-6}}; // эл-ты 2-ой строки
При этом если инициализирующих значений меньше, чем элементов массива, то остаток массива обнуляется; если больше - лишние значения не используются.
В Си нет массивов с переменными границами. Но, если количество элементов массива известно до выполнения программы, можно определить его как константу с помощью директивы #define , а затем использовать ее в качестве границы массива, например,
#define n 10;
Main ( )
{ int a[n], b[n]; // Объявление 2-х одномерных массивов
…
Если количество элементов массива определяется в процессе выполнения программы, используют динамическое выделение оперативной памяти компьютера (ОП).