Работа с векторами и матрицами (Лабораторная работа № 1), страница 5

// выделение памяти под массив

     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;