Двумерные массивы в Си — это массив одномерных массивов.
Введение
Если требуется разрешить задачу с существенными объёмами информационных однотипных данных и использованием разных переменных, не прошедших сортировку по адресации памяти, то при этом возникает большое количество проблем при попытке программно реализовать процесс решения. Чтобы облегчить программное построение алгоритма разрешения стоящей проблемы, в таких случаях в программных языках и в частности Си используют объекты, называемые массивами.
Массив — это фиксированный участок памяти, содержащий комплект объектов одного типа и который имеет одно имя.
Массив характеризуется такими составляющими:
Элемент массива. Это величина, хранящаяся в предназначенной ей ячейке памяти, которая расположена в области массива, и ещё адрес этой ячейки памяти. Любой элемент массива характеризуется следующими параметрами:
- Его адресацией. Имеется ввиду адрес начальной ячейки памяти, в которой расположен данный элемент.
- Индекс элемента. А именно его нумерация в составе массива.
- Непосредственно содержимое (значение) элемента.
Адресация массива. То есть адрес начального элемента.
Наименование массива. То есть идентификационный признак, по которому идёт обращение к элементам массива.
Величина массива. То есть количество элементов массива.
Объём элемента. То есть количество байт, занимаемое одним элементом массива.
Размер массива. То есть количество байт, отведённое в памяти для хранения всех элементов массива. Следовательно, длина массива — это размер одного элемента, умноженный на их общее число.
Двумерные массивы в Си
По своей размерности массивы в Си бывают одномерные, двумерные и многомерные. Под многомерными понимаются такие массивы, которые имеют больше чем один индекс. Многомерные массивы можно интерпретировать как комплект компонентов, которые распределены по нескольким координатам. Двумерный массив можно графически изобразить следующим образом:
1 [][][][]
2 [][][][]
3 [][][][]
То есть здесь изображён двумерный массив, имеющий размерность три на пять, что означает наличие трёх строк и пяти столбцов. Процедура задания двумерного массива аналогична объявлению одномерного массива, но при объявлении двумерного массива требуется задать внутри квадратных скобок размеры для всех направлений. Например, необходимо выполнить объявление двумерного массива, который имеет размер 8*8 (между прочим, эти размеры совпадают с размерами доски для игры в шашки, которая тоже разбита на восемь строчек и восемь столбиков):
int checkers[8][8]; // двумерный массив
То есть, такой массив можно применять для хранения данных о партиях при игре в шашки. Аналогичным образом можно использовать возможности двумерного массива для хранения информации о других игровых событиях, к примеру, шахматах и тому подобное. Чтобы получить доступ к компонентам двумерных массивов, требуется применять пару индексов, указывающих на нумерацию столбцов и строчек. Приведённые выше условия можно применить и к массивам большего размера, вплоть до N. Однако следует отметить, что массивы уже с четырьмя параметрами достаточно сложно выразить в графическом виде. Чтобы задать конкретные величины элементов массива, требуется сделать примерно следующие процедуры:
1. // первый компонент массива получит значение шесть
1. myArray[0] = 6;
Приведём пример присвоения конкретной величины компоненту двумерного массива:
1. // данный компонент массива получит значение 11
1. myArray[1][3] = 11;
В этом примере выполнено задание значения одиннадцать заданному компоненту двумерного массива myArray, который располагается на второй строчке и в четвёртом столбике. Данный массив можно изобразить так:
1 [__][__][__][__][__]
2 [__][__][__][10][__]
3 [__][__][__][__][__]
Следует помнить, что нумерация положения компонентов в строчках и столбиках ведёт отсчёт от нуля. Это означает, что первый компонент обладает нулевым индексом, по этой причине в примере выше индексы указаны на единицу меньше требуемых номеров координат. Также необходимо учитывать, что запрещается делать запись информации за конечным компонентом массива. Например, когда массив включает в свой состав одиннадцать компонентов, то запрещаются попытки назначения какого-либо значения компоненту, имеющему номер одиннадцать, так как конечный компонент в данном массиве обладает индексом десять. А компонента, имеющего индекс одиннадцать, просто не существует. Если всё-таки попытаться это выполнить, то вероятны самые непредсказуемые последствия, вплоть до создания помех в работе другим программам. Но, как правило, в функции операционных систем заложена блокировка недостоверных процедур такого вида. Ниже приведён пример реального использования в программе двумерного массива:
Рисунок 1. Программа. Автор24 — интернет-биржа студенческих работ
После выполнения работы данной программы можно видеть следующие результаты:
CppStudio.com
Выполнено формирование массива:
[0][0]=0 [0][1]=0 [0][2]=0 [0][3]=0 [0][4]=0 [0][5]=0 [0][6]=0 [0][7]=0
[1][0]=0 [1][1]=1 [1][2]=2 [1][3]=3 [1][4]=4 [1][5]=5 [1][6]=6 [1][7]=7
[2][0]=0 [2][1]=2 [2][2]=4 [2][3]=6 [2][4]=8 [2][5]=10 [2][6]=12 [2][7]=14
[3][0]=0 [3][1]=3 [3][2]=6 [3][3]=9 [3][4]=12 [3][5]=15 [3][6]=18 [3][7]=21
[4][0]=0 [4][1]=4 [4][2]=8 [4][3]=12 [4][4]=16 [4][5]=20 [4][6]=24 [4][7]=28
[5][0]=0 [5][1]=5 [5][2]=10 [5][3]=15 [5][4]=20 [5][5]=25 [5][6]=30 [5][7]=35
[6][0]=0 [6][1]=6 [6][2]=12 [6][3]=18 [6][4]=24 [6][5]=30 [6][6]=36 [6][7]=42
[7][0]=0 [7][1]=7 [7][2]=14 [7][3]=21 [7][4]=28 [7][5]=35 [7][6]=42 [7][7]=49
В данном примере, сначала осуществляется задание значений элементам двумерного массива, которые равняются произведению индексов, в строках, начиная с восьмой и заканчивая одиннадцатой. Затем выполняется вывод на монитор его содержимого, то есть строк с тринадцатой по двадцатую. Когда нужно объявить указатель на массив, то запрещено использовать процедуру «взять адрес» (&). Ниже приведён пример объявления указателя на массив:
1 char *ptrArray;
2 char myString[10];
3 ptrArray = myString; // указателю присвоен адрес начального компонента
массива myString
без применения &