Динамический двумерный массив Си — это прямоугольная таблица с задаваемым при выполнении программы количеством столбцов и строк.
Введение
Под двумерным массивом понимается прямоугольная таблица с заданным числом столбцов и строк. Каждый столбец и каждая строка должны иметь свои порядковые номера.
На рисунке 1 представлен образец двумерного массива.
Рисунок 1. Двумерный массив. Автор24 — интернет-биржа студенческих работ
Нумерация строк и столбцов должна начинаться с нуля. То есть если в массиве шесть строк, то последняя будет обозначаться цифрой пять. Чтобы объявить массив, надо указать вначале тип данных, далее присвоить имя массиву, в затем в квадратных скобках прописать его размер, то есть число строчек и столбцов. На рисунке два показан пример объявления двумерного массива, имеющего шесть строк и семь столбцов.
Рисунок 2. Пример двумерного массива. Автор24 — интернет-биржа студенческих работ
Необходимо также отметить, что всегда сначала пишется число строк, а затем число столбцов. Инициализировать работу двумерного массива возможно сразу при его объявлении. Для этого необходимо обозначить все компоненты массива, например, так:
Листинг 19.1
int arr [2][4] = {{1,2,4,29},{3,4,6,1}};
Приведённая запись означает создание массива, состоящего из двух строк и четырёх столбцов с заданными значениями каждого элемента. На рисунке 3 представлен данный массив.
Рисунок 3. Заданный массив. Автор24 — интернет-биржа студенческих работ
Помимо этого, возможно задание лишь отдельных элементов массива, при этом не назначенные элементы будут иметь нулевые значения. К примеру:
Листинг 19.2
int arr [2][4] = {{1,2,4},{3,4}};
На рисунке 4 представлен вид такого массива.
Рисунок 4. Пример массива. Автор24 — интернет-биржа студенческих работ
Для работы с каким-либо компонентом массива необходимо задать номер строки и столбца, определяющих его местоположение. На рисунке 5 показан пример выбора элемента, расположенного во второй строке и третьем столбце.
Рисунок 5. Пример выбора элемента. Автор24 — интернет-биржа студенческих работ
Динамический двумерный массив
Под этим термином понимается такой массив, объём которого возможно изменять при выполнении программы. Способность поменять объём является главным отличием динамического массива от статического, объём которого задаётся при формировании программы.
Чтобы размеры динамического массива можно было бы изменять, языки программирования, которые работают с данными массивами, должны быть оснащены необходимыми функциональными возможностями. Использование динамических массивов даёт возможность наиболее гибкого оперирования с информацией, поскольку можно не делать прогнозы объёмов данных для сохранения, а просто изменять размеры массива согласно действительно требуемым объёмам.
Помимо этого, к динамическим массивам можно отнести массивы с непостоянной длиной, размеры которых не определены строго при компиляции программы, а могут быть заданы при формировании или инициализации массива при выполнении программы. От полноценных динамических массивов их отличает отсутствие средств коррекции размера в автоматическом режиме с запоминанием данных. Это означает, что при такой потребности программист вынужден будет создать такие возможности сам.
Обслуживание динамических массивов может выполняться или на уровне выражений самого программного языка, или при помощи системных библиотек. Формальное представление динамического массива может как иметь отличия в синтаксисе по сравнению с представлением статического массива, так может и не иметь их. В последнем случае, обычно, любые массивы в программном языке считаются имеющими возможность стать динамическими, что позволяет программисту самому решать, когда применять это свойство для каждого конкретного случая.
Если динамические массивы обслуживаются при помощи системных библиотек, то тогда они формируются как классы или обобщённые типы (так называемые «шаблоны» мом «дженерики»). Использование динамических массивов обязует иметь в наличии возможность (операцию), позволяющую определить текущий размер массива. Изначально размеры динамического массива или равняются нулю, или определяются описанием, или при инициализации. Затем размер массива меняется при помощи специальной процедуры (операции).
При реализации массива с функцией динамической коррекции размера необходимо искать компромиссное решение среди некоторых противоречивых требований:
Использование ресурсов памяти. Организация динамического массива не должна существенно увеличивать использование ресурсов памяти.
С точки зрения производительности:
- Необходимо минимизировать текущие расходы на коррекцию объёмов массива.
- Требуется сохранить, если возможно, постоянное время доступа на чтение и запись компонентов массива.
Необходимо обеспечить совместимость со статической организацией массивов на низких уровнях.
Динамический двумерный массив Си
Непосредственно язык Си не имеет возможностей динамического массива, но он имеет стандартные библиотечные функции mаllос, frее и rеаllос, которые дают возможность сформировать массивы переменных размеров. Например,
int mаs = (int)malloc(sizеof(int) * n); // Формирование массива из n компонентов типа int
...
mаs = (int)rеalloc(mаs, sizеоf(int) m); // Меняет размер массива с n на m сохраняя содержимое
...
frеe(mаs); // Очистка памяти после того, как закончено применение массива.
Минусом такого метода является необходимость определять объём требуемой памяти, использовать явное изменение типа массива, а также следить за временем использования (жизни) массива.
Двумерный (и более) динамический массив возможно создать как массив, указывающий на другие массивы:
int A = (int )malloc(Nsizeof(int ));
for(int i = 0; i
A[i] = (int )malloc(Msizeof(int));
Следует заметить, что при увеличении размерности значительно осложняются процессы формирования массивов и очистки памяти после окончания работы массива.
Отдельные версии программы Си имеют не стандартизированную функцию библиотеки vоid *allоca(sizе_t sizе), которая даёт возможность упростить использование динамических массивов. Данная функция распределяет память не в общей куче (как mallоc), а в стеке, при этом память в автоматическом режиме очищается по функции return.