// выделение памяти под массив
A= new double[m+1][10];
if (A==NULL)
{
cout<<"Недостаточно памяти!"<<endl;
getch();
return;
}
// вывод указателя
cout<<endl<<"Значение указателя после выделения памяти"<<endl;
cout<<"A = "<<A<<endl;
getch();
// заполнениемассива
for (i=1; i<=m; i++)
for (j=1; j<=9; j++)
A[i][j]=i+0.1*j;
// вывод массива на дисплей
cout<<endl;
for (i=1; i<=m; i++)
{
for (j=1; j<=9; j++)
printf("%5.2f ",A[i][j]);
printf("\n");
}
getch();
// освобождениепамяти
delete [] A;
// вывод указателя
cout<<endl<<"Значение указателя после очистки памяти"<<endl;
cout<<"A = "<<A<<endl;
getch();
// обнуление указателя
A=NULL;
// вывод указателя
cout<<endl<<"Значение указателя после его обнуления"<<endl;
cout<<"A = "<<A<<endl;
getch();
}
В описании данных определяется указатель на массив из 10 элементов типа double. Одновременно он инициализируется константой NULL. (Обратите внимание на обязательность круглых скобок. Описание double *A[10]=NULL; тоже синтаксически правильно, но оно определяет массив указателей на переменные типа double.) Выделение памяти осуществляется оператором
A = new double[m+1][10]; , где m – ранее заданное число строк (нулевую строку предполагается не использовать).
Далее работа с массивом осуществляется обычным образом. В данном примере происходит заполнение массива, а затем его вывод на дисплей в виде матрицы.
Во втором варианте (листинг 6) директивой **A = NULL определяется указатель на указатель с одновременной инициализацией. Затем оператором
A = new double *[m+1]
выделяется память под массив указателей, каждый из которых соответствует массиву-строке. Затем в цикле по i выделяется память под каждую строку.
for (i=0; i<=m; i++)
A[i] = new double *[n+1];
Далее работа с массивом осуществляется, как обычно. После ее завершения необходимо освободить память массива.
Листинг 6
// Динамическое выделение памяти под двумерный массив
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
void main()
{
// описание данных
int i,j,m,n;
double **A=NULL;
// вывод указателя
clrscr();
cout<<"Исходное значение указателя"<<endl;
cout<<"A = "<<A<<endl;
getch();
// ввод размеров массива
cout<<endl<<"Введите число строк "; cin>>m;
cout<<endl<<"Введите число столбцов "; cin>>n;
// выделение памяти под массив указателей
A=new double *[m+1];
if (A==NULL)
{
cout<<"Недостаточно памяти!"<<endl;
getch();
return;
}
// вывод указателя
cout<<endl<<"Значение указателя начала всего массива"<<endl;
cout<<"A = "<<A<<endl;
getch();
// выделение памяти под каждую строку
for (i=0; i<=m; i++)
{
A[i]= new double[n+1];
if (A[i]==NULL)
{
cout<<"Недостаточнопамятипо i="<<i<<"!"<<endl;
getch();
return;
}
}
// вывод указателей на каждую строку
cout<<endl<<"Значение указателей начала каждой строки"<<endl;
for (i=0; i<=m; i++)
cout<<i<<" "<<A[i]<<endl;
getch();
// заполнениемассива
for (i=1; i<=m; i++)
for (j=1; j<=n; j++)
A[i][j]=i+0.1*j;
// вывод массива на дисплей
cout<<endl<<"Матрица:"<<endl;
for (i=1; i<=m; i++)
{
for (j=1; j<=n; j++)
printf("%5.2f ",A[i][j]);
printf("\n");
}
getch();
// освобождениепамяти
delete [] A;
// вывод указателя
cout<<endl<<"Значение указателя после очистки памяти"<<endl;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.