Этапы разработки программы. Разработка или выбор алгоритма решения поставленной задачи. Оформление документации на программу, страница 21

Динамическим называется массив, размерность которого становится известной в процессе выполнения программы. Были рассмотрены также примеры создания одномерных динамических массивов на языке C (C++) и PASCAL.

Иногда при программировании возникает необходимость в создании многомерных динамических массивов. Вспомним как хранится многомерный массив в памяти?

Например, в языке C (C++) двумерный массив в памяти представляется как массив массивов.

Пример1: int mas[2][3];          1 2 3      - mas[0]

4 5 6     - mas[1]

объявлен массив из 2–х элементов, каждый из которых представляет собой массив из 3-х целых чисел. Особенностью языка C (C++) в отличие от PASCAL является несамоопределенность массивов, т.е. по имени массива невозможно узнать его размерность и размер по каждому измерению.

Пример2: Если объявлен массив float mas2[3][4][5], то это не 3-х мерный, а одномерный массив mas2, включающий 3 элемента, каждый из которых имеет тип float[4][5]. В свою очередь, каждый из 4-х элементов имеет тип float[5].

Создадим двумерный динамический массив целых чисел размерностью n*k, используя язык C++

#define N 100

mas = new int[n][k] //ОШИБКА! Выделять память под 2- мерный массив по аналогии с                                            одномерным нельзя.

int n, k, i, ** mas;    //указатель на массив указателей.         

cin>>n;                    // n – число строк массива.                 

cin>>k;                    // k – число столбцов массива.   

mas = new int[n];    //выделение памяти для вспомогательного массива указателей

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

{mas[i] = new int[k];   //выделение памяти для каждой строки.

For(j=0;j<k;j++)

*(mas[i]+1)=0; (mas[i][j]=0);

for(i=0;i<n; i++)delete mas[i];  // освобождение памяти

delete mas;

……..

mas

mas[0]

mas[1]

…..

…..

….

mas[n-1]

mas[0][0]

mas[0][1]

………

mas[0][k-1]

mas[1][0]

mas[1][1]

………

mas[1][k-1]

mas[n-1][0]

mas[n-1][1]

………..

mas[n-1][k-1]

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

Создание двумерного динамического массива на языке PASCAL:

TYPE   MAS = ARRAY [1..2] OF INTEGER;

MASUK = ARRAY [1..2] OF ^MAS;

VAR M: ^MASUK;

N,I,J,K : INTEGER;

BEGIN

{$R-} {выключение проверки значения индекса массива}

READ (N);

READ (K);

GETMEM (M, SIZEOF(MAS)*N);  {ввод матрицы}

FOR  I:=1 TO  N  DO

BEGIN

GETMEM (M^[I],2*K);

FOR  J:=1 TO  K  DO

READ(M^[I]^[J]);

END;      

- - - - - - {вывод матрицы}

FOR  I:=1 TO  N  DO

BEGIN

WRITELN; 

FOR  J:=1 TO  K  DO

WRITE(M^[I]^[J]);

FREEMEM (M^[I], 2*K);

END;    

FREEMEM (M, SIZEOF(MAS)*N); 

{$TR+}

END.

Замечания:

1) Т.к. имя массива в языке C является указателем на 1-ый элемент массива, который является в свою очередь указателем на другую переменную типа массив, то поэтому можно использовать указатель на указатель.

2) Массивы указателе в основном используют для:

-   размещения в памяти многомерных динамических массивов (например матрицу)

-  инициализации строк при создании массивов строк

char * mas_str[3]={“строка 1”,”строка 2”,”строка 3”};

3) В языке C для объявления указателя на многомерный массив, используют следующий оператор: <идентификатор> (*<имя указателя>)[n];.