Для выделения памяти под одномерный массив целых чисел нам потребовался указатель
на целые числа. Для матрицы надо выделить указатель на массив целых чисел, который объявляется как
int **A;
Но лучше всего сразу объявить новый тип данных - указатель на целое число. Новые типы объявляются директивой typedef вне всех процедур и функций (там же, где и глобальные переменные).
typedef int *pInt;
Этой строкой мы сказали компилятору, что любая переменная нового типа pInt представляет собой указатель на целое число или адрес массива целых чисел. К сожалению, место для матрицы не удается так же просто выделить в памяти, как мы делали это для одномерного массива.
Если написать просто
int M = 5, N = 7;
pInt *A;
A = new int[M][N]; // ошибочная строка
компилятор выдает множество ошибок. Связано это с тем, что ему требуется заранее знать длину одной строки, чтобы правильно расшифровать запись типа A[i][j]. Ниже рассмотрены три способа решения этой проблемы.
Известный размер строки
Если размер строки матрицы известен, а неизвестно только количество строк, можно по-
|
|
ступить так: ввести новый тип данных – строка матрицы. Когда количество строк станет известно, с помощью оператора new выделяем массив таких данных.
typedef int row10[10]; // новы тип: массив из 10 элементов
Main()
{
int N;
row10 *A; // указатель на массив (матрица)
printf ("Введите число строк ");
scanf ("%d", &N);
A = new row10[N]; // выделить память на N строк
A[0][1] = 25; // используем матрицу, как обычно
printf("%d", A[2][3]);
Delete A; // освобождаем память
}
Неизвестный размер строки
Пусть размеры матрицы M и N заранее неизвестны и определяются в ходе работы про-
граммы. Тогда можно предложить следующий способ выделения памяти под новую матрицу.
Поскольку матрицу можно рассматривать как массив из строк-массивов, объявим M указателей и выделим на каждый из них область памяти для одномерного массива размером N (то есть, на одну строку). Сами эти указатели тоже надо представить в виде динамического массива. Определив требуемые размеры матрицы, мы выделяем сначала динамический массив указателей, а потом на каждый указатель – место для одной строки.
typedef int *pInt; // новый тип данных: указатель на целое
Main()
{
int M, N, i;
pInt *A; // указатель на указатель
// ввод M и N
A = new pInt[M]; // выделить память под массив указателей
for (i = 0; i < M; i ++) // цикл по всем указателям
A[i] = new int[N]; // выделяем память на строку i
// работаем с матрицей A, как обычно
for (i = 0; i < M; i ++) // освобождаем память для всех строк
delete A[i];