1. Введение
Представьте себе обычный массив как длинный ящик из-под пиццы, где все кусочки лежат в ряд — вкусно, но однообразно.
А теперь представим расписание работ или шахматную доску. Там уже всё организовано в строки и столбцы — то есть в таблицу. Вот это и есть классическая задача для двумерного массива.
В реальной жизни двумерные массивы встречаются на каждом шагу:
- Таблицы с зарплатами сотрудников (строки — сотрудники, столбцы — месяцы).
- Картинка на экране (каждая "клетка" — цвет пикселя, их две координаты: X и Y).
- Матричные вычисления и обработка данных.
- Шахматная доска или поле для крестиков-ноликов.
Иногда двумерный массив называют матрицей (это название пришло из математики).
Есть очень много мест, где вам как программисту может понадобиться двумерный массив. Реализация практически любой настольной игры — это готовый двумерный массив: «Шахматы», «Шашки», «Крестики-Нолики», «Морской бой»:
Игровое поле «Шахмат» или «Морского боя» такое, что оно просто идеально ложится на двумерные массивы, где в качестве координат клеток нужно будет использовать только числа. Не «пешка e2 → e4», а «пешка (4,1) → (4,3)». Вам так программисту будет даже проще.
2. Синтаксис объявления двумерных массивов
Страшно только до первого объявления! Разбираемся шаг за шагом.
Общее правило
тип[,] имяМассива;
Здесь запятая , внутри скобок — не ошибка компилятора после ночи с кофе, а указание: массив двумерный.
Примеры
int[,] matrix;
double[,] gradesTable;
string[,] chessBoard;
Создание массива
Задаём размеры: количество строк и столбцов.
matrix = new int[3, 4]; // 3 строки, 4 столбца
Это табличка 3x4: представьте Excel-таблицу с 3 строками и 4 колонками.
Можно сразу объявить переменную и создать двумерный массив:
int[,] matrix = new int[3, 4];
Можно инициализировать сразу значениями (примерно как с одномерным):
int[,] example = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// Таблица 3 строки, 3 столбца
Важно: ВСЕ строки при такой инициализации должны быть одной длины. Нельзя сделать первую строку из 3 элементов, вторую — из 2.
Визуальная схема
┌─────┬─────┬─────┬─────┐
│ 0 │ 1 │ 2 │ 3 │ ← столбцы (Columns)
├─────┼─────┼─────┼─────┤
│ 0,0 │0,1 │0,2 │0,3 │ ← строка 0 (Row 0)
├─────┼─────┼─────┼─────┤
│ 1,0 │1,1 │1,2 │1,3 │ ← строка 1 (Row 1)
├─────┼─────┼─────┼─────┤
│ 2,0 │2,1 │2,2 │2,3 │ ← строка 2 (Row 2)
└─────┴─────┴─────┴─────┘
Каждый элемент задаётся парой индексов [строка, столбец].
3. Индексация и доступ к элементам
В двумерном массиве для доступа к элементу указываются два индекса:
- Первый — номер строки
- Второй — номер столбца
matrix[1, 2] = 99; // Во второй строке (индекс 1), третий столбец (индекс 2)
Если кто-то привык к шахматам, напомню: индексация начинается с нуля. То есть, первый элемент — это [0, 0].
Запись и чтение
int[,] data = new int[5, 2];
data[1, 1] = 5; // запись
int value = data[1, 1]; // чтение
Вот как это будет выглядеть в памяти:
4. Заполнение двумерного массива
Давайте напишем код, который заполнит матрицу последовательными числами от 1 до 12, чтобы стало понятно, как это работает.
int[,] matrix = new int[3, 4];
int value = 1;
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 4; col++)
{
matrix[row, col] = value;
value++;
}
}
Здесь внешний цикл перебирает строки, внутренний — столбцы.
Иллюстрация:
После выполнения:
┌────┬────┬────┬────┐
│ 1 │ 2 │ 3 │ 4 │
├────┼────┼────┼────┤
│ 5 │ 6 │ 7 │ 8 │
├────┼────┼────┼────┤
│ 9 │10 │11 │12 │
└────┴────┴────┴────┘
5. Размерности: получение количества строк и столбцов
Часто размеры массива нужно узнать "в динамике". В C# для этого есть удобный метод GetLength().
int[,] matrix = new int[3, 4];
int rows = matrix.GetLength(0); // количество строк (первое измерение) - 3
int columns = matrix.GetLength(1); // количество столбцов (второе измерение) - 4
Console.WriteLine($"Строк: {rows}, Столбцов: {columns}");
не путайте с Length — у двумерного массива это общее количество всех элементов (строки × столбцы).
6. Вывод двумерного массива на экран
Для вывода двумерной таблицы обычно используют двойной цикл — и это все равно что рисовать лабиринт в консоли. Пример:
for (int row = 0; row < matrix.GetLength(0); row++)
{
for (int col = 0; col < matrix.GetLength(1); col++)
{
Console.Write(matrix[row, col] + "\t"); // "\t" — табуляция для красоты
}
Console.WriteLine(); // переход на новую строку
}
Пример вывода:
1 2 3 4
5 6 7 8
9 10 11 12
Кстати, вот тут вы научились красиво "рисовать" таблицы с помощью пары строк кода!
7. Многомерные массивы
И еще один интересный факт о массивах, о котором вы, наверное, уже догадываетесь. Если можно сделать двумерный массив, значит можно сделать и трехмерный?
Да, можно создать массив любой размерности. Такие массивы называют многомерными.
Как объявлять многомерные массивы
Достаточно просто перечислить нужное количество размеров через запятую:
int[,,,] matrix = new int[2, 3, 4, 5];
Здесь у нас четырёхмерный массив:
- 2 элемента по первой координате,
- 3 — по второй,
- 4 — по третьей,
- 5 — по четвертой.
В памяти такой массив — это один большой “куб” данных, упакованный последовательно.
Как обращаться к элементам
Доступ к элементу осуществляется по всем индексам сразу:
matrix[0, 1, 2, 3] = 42;
int value = matrix[1, 2, 0, 4];
- Индексы нумеруются с нуля, как всегда в C#.
- Всего в таком массиве будет 2 × 3 × 4 × 5 = 120 элементов.
Практические примеры многомерных массивов
- 2D — таблицы, шахматные доски, изображения.
- 3D — “кубики” в компьютерной графике, данные для научных расчетов (например, температура в разных точках пространства и времени).
- 4D и выше — редко используются, но встречаются в продвинутой математике, симуляциях, машинном обучении и пр.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ