Выделение памяти для матрицы

Для выделения памяти под одномерный массив целых чисел нам потребовался указатель

на целые числа. Для матрицы надо выделить указатель на массив целых чисел, который объявляется как

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];


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: