
- •7. Указатели, массивы
- •7.1. Понятие адреса
- •7.2. Указатели
- •7.3. Арифметические операции и операции сравнения
- •7.4. Указатели и одномерные массивы
- •7.5. Возвращение функцией нескольких значений
- •7.6. Указатели на указатели
- •7.7. Массивы указателей и двумерные массивы
- •7.8. Массивы динамической памяти Одномерные динамические массивы
- •Двумерные динамические массивы
- •8. Строки
- •9. Структуры
- •9.1. Объявление структуры
- •9.2. Вложенные структуры
- •9.3. Статические массивы в структурах
- •9.4. Статический массив структур
- •9.5. Структуры и указатели
- •9.6. Динамический массив структур
- •9.7.Ссылка на структуру
- •9.8. Структуры и функции
Двумерные динамические массивы
При создании статического двумерного массива под массив выделяется сплошной участок памяти с учетом количества строк и столбцов и типа элементов массива.
При создании двумерного динамического массива, разные его части (например, строки) могут находиться в разных областях памяти.
Использование массивов указателей и средств динамического распределения памяти при работе с двумерными массивами позволяет рационально распределять память.
При создании двумерного динамического массива сначала выделяется память под одномерный массив указателей, в котором будут храниться адреса одномерных массивов (например, адреса строк матрицы). Адрес этого массива указателей запоминается в переменной, которая объявлена как указатель на указатель. Затем выделяется память под каждый из одномерных массивов (под строки матрицы), при этом их адреса заносятся в соответствующие элементы массива указателей.
Например, при создании динамического массива для работы с целочисленной матрицей из 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;
}
}