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

11Динамические массивы

Во многих случаях заранее не известно, какое количество данных требуется обрабатывать программе, либо размер обрабатываемых данных часто меняется в процессе ее работы. Объявление статических массивов в этом случае приводит к тому, что значительная часть памяти тратится впустую.

Для решения данной проблемы и применяются динамические массивы, для работы с которыми используются указатели.

Операция new тип_массива выделяет в динамической памяти участок для размещения массива соответствующего типа, но не позволяет его инициализировать. В результате выполнения операция new возвратит указатель, значением которого служит адрес первого элемента, размер массива должен быть полностью определен.

long ( *lp ) [2][4] ;

lp = new long [3][2][4];

Операция delete [ ] lp; освободит целиком всю память, выделенную для определенного выше массива, если lp адресует его начало.

Следующая программа формирует, заполняет данными, печатает и уничтожает массив, представляющий прямоугольную диагональную матрицу (единичную), порядок которой (размеры массива) вводятся пользователем с клавиатуры:

# include < iostream.h >

void main ( )

{ int n ;

cout << "\n Введите порядок матрицы :" ; cin >> n ;

float **matr ; //указатель для массива указателей

matr = new float *[n] ; //массив указателей float*

if (matr == NULL) { cout << "Не создан динамический массив" ;

return ; // завершение программы }

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

{ matr [i] = new float [n] ; // строка- массив значений типа float

if (matr [i] == NULL )

{ cout << "Не создан динамический массив ";

return ; // завершение программы }

for ( int j = 0; j < n; j ++ ) if ( i != j ) matr [i] [j] = 0

else matr [i] [j] = 1 ;

}

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

{ cout << "\n строка " << (i+1) << " : " ;

for ( int j = 0; j < n; j ++ ) cout << "\t" << matr [i] [j] ;

}

for ( i = 0; i < n; i ++ ) delete matr [i] ;

delete [ ]matr ;

}

Результат:

Введите размер матрицы: 5

Строка 1 : 10000

Строка 2 : 01000

Строка 3 : 00100

Строка 4 : 00010

Строка 5 : 00001

                            0 1 2 ... n-1

0

*

1

0

0

...

0

1

*

0

1

0

...

0

2

*

0

0

1

...

0

. . . . . . . . . . . . . . . . . . . . . . . . . .

n-1

*

0

0

0

...

1

э лементы типа float

Рисунок 2 – Одномерный массив указателей

На рисунке 2 изображена схема взаимосвязи (n+1) -одномерных массивов, из n элементов каждый. Эти (n+1) массивов совместно имитируют квадратную матрицу с изменяемыми размерами, формируемую в программе.