Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестр_2_С++.doc
Скачиваний:
4
Добавлен:
23.04.2019
Размер:
217.09 Кб
Скачать

Двумерные динамические массивы

При создании статического двумерного массива под массив выделяется сплошной участок памяти с учетом количества строк и столбцов и типа элементов массива.

При создании двумерного динамического массива, разные его части (например, строки) могут находиться в разных областях памяти.

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

При создании двумерного динамического массива сначала выделяется память под одномерный массив указателей, в котором будут храниться адреса одномерных массивов (например, адреса строк матрицы). Адрес этого массива указателей запоминается в переменной, которая объявлена как указатель на указатель. Затем выделяется память под каждый из одномерных массивов (под строки матрицы), при этом их адреса заносятся в соответствующие элементы массива указателей.

Например, при создании динамического массива для работы с целочисленной матрицей из n строк и m столбцов, следует выполнить следующие действия:

int ** Matrix; //Выдел. память под переменную, где будет храниться адрес мас. указателей.

Matrix = new int *[n]; //Выделяется память под одномерный массив указателей на строки.

for(int i = 0; i < n; i++)

Matrix[i] = new int[m]; //Выделяется память под i строку матрицы.

В силу сложной структуры удаление двумерного массива происходит в несколько этапов. Cначала удаляются одномерные массивы элементов.

for(int i = 0; i < N; i++)

delete [] Matrix[i];

Затем удаляется массив указателей на одномерные массивы элементов.

delete [] Matrix;

Для обращения к элементам динамического массива с индексами i и j допускается как обращение Matrix[i][i], так и *( *( Matrix + i) + j ).

Пример 7.6. Дана целочисленная квадратная матрица порядка n. Размер матрицы ввести с клавиатуры. Сформировать динамический двумерный массив. Транспонировать матрицу на том же месте. Вывести на экран исходный и полученный результаты. Удалить динамический массив.

Текст программы.

#include <iostream.h>

#include <stdlib.h>

int** InitMatrix ( int );

void DisplayMatrix ( int **, int );

void TranspouseMatrix ( int**, int);

int main()

{

int n;

cout<<"Enter the n:";

cin>>n;

int** Matrix=InitMatrix(n);

if(Matrix ==NULL)

{

cout<<"\nДинамическая матрица не существует!\n";

system("pause");

return 0;

}

cout<<"\n\tИсходная матрица\n";

DisplayMatrix(Matrix,n);

TranspouseMatrix(Matrix,n);

cout<<"\n\tТранспонированная матрица\n";

DisplayMatrix(Matrix , n);

for(int i=0; i<n; i++) //Освобождение дина

delete[]Matrix[i];

delete[]Matrix;

system("pause");

return 0;

}

int** InitMatrix (int n)

{

int** Point = new int* [n];

if (Point == NULL) return NULL;

for( int i = 0; i < n; i++)

{ Point[i] = new int [n];

if (Point[i] == NULL) return NULL;

}

for(int i = 0; i < n; i++)

for(int j = 0; j < n; j++)

*(*(Point+i)+j) = i + 1;

return Point;

}

void DisplayMatrix ( int** Point, int n)

{

for(int i= 0; i<n; i++)

{

for(int j=0; j<n; j++)

{

cout.width(4);

cout<<*(*(Point+i)+j);

}

cout<<endl;

}

}

void TranspouseMatrix ( int ** Point, int n)

{

for(int i=0; i<n; i++)

for(int j=i+1; j<n; j++)

{

int x=*(*(Point+i)+j);

*(*(Point+i)+j)=*(*(Point+j)+i);

*(*(Point+j)+i)=x;

}

}