Оператор array-new выделяет только одномерные массивы. Существуют разные решения, в зависимости от того, какую структуру массива вы хотите. Для измерений, известных только во время выполнения, вы можете создать массив массивов:
char **a = new char*[rows];
for (int i = 0; i < rows; ++i) {
a[i] = new char[columns];
}
или массив элементов со связанным массивом указателей на первый элемент каждой строки (требующий только двух попаданий в распределитель памяти):
char *a = new char[rows*columns];
char **a = new char*[rows];
for (int i = 0; i < rows; ++i) {
a[i] = a + i*columns;
}
Любой из них позволит вам получить доступ к элементам матрицы через a[row][column]
.
Альтернативное решение - просто использовать одномерный массив и генерировать индексы вручную:
char *a = new char[rows*columns];
...
a[columns*row + column]
Это, вероятно, быстрее, чем двойное косвенное обращение, требуемое в первых двух решениях.
Конечно, вы можете обернуть это в классе, чтобы сохранить подобие синтаксиса двумерного индексирования:
class MatrixWrapper {
...
char& operator()(int row, int column) { return a_[columns*row + column]; }
...
};
...
a(row, column)