Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцииЛаб(Часть_1_Книги).doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
863.23 Кб
Скачать

Int *arr_of_size;

Выделяем память для этого массива и запоминаем адрес его начала:

arr_of_size=new int[n];

Определяем значения массива, например, вводим, вообще говоря, различное количество элементов строк с экрана:

for (int i=0;i<n;i++) cin>>arr_of_size[i];

Четвёртый этап, на котором резервируется память для каждой строки “матрицы”, меняем следующим образом. Количество элементов i-й строки берём из сформированного массива arr_of_size

for (int i=0; i<n; i++) D[i]= new int[arr_of_size [i]];

Удаление такой “матрицы” из памяти выполняется аналогично, как и удаление динамической матрицы с одинаковым количеством элементов в строках. Объясняется это тем, что в операции delete размер освобождаемой памяти мы не указываем. Освобождаем память такого объёма, сколько зарезервировали с помощью операции new.

Пример работы с такой матрицей приведен в лабораторной работе 5 (пример 3).

Как и для частично динамической матрицы, можно создать “матрицу”, количество элементов в строках которой будет меняться по некоторому правилу. Например, можно создать в памяти нижний (или верхний) треугольник квадратной “матрицы” относительно главной (побочной) диагонали.

Пример работы с такой матрицей приведен в лабораторной работе 5 (пример 2).

Упражнение. Сравните динамическую матрицу со статической матрицей по следующему плану: 1) размерности матриц; 2) когда, на каком этапе выделяется память? 3) как она распределяется, как элементы матрицы расположены в памяти? 4) как осуществляется доступ к элементам матриц? 5) для какой матрицы, когда и как можно освободить память?

4.3. Передача матрицы в функцию

Один из способов передачи матрицы в функцию был рассмотрен в первом семестре. Его недостаток в том, что в прототипе функции для матрицы необходимо было обязательно указывать вторую размерность матрицы, то есть количество элементов в строках. Здесь предлагается более профессиональный способ, основанный на понятиях указатель на указатель и динамические “матрицы”.

Вспомним, что обычный одномерный, например, числовой массив в качестве параметра функции можно передать двумя способами:

void FunArr1 (int *z, int , … );

или

void FunArr1 (int z[], int,… );

но в любом из вариантов мы передаём адрес начала массива.

Аналогично матрица как параметр функции объявляется в прототипе, например, одним из следующих способов:

void FunMatr (int **X, int , int );

или

void FunMatr (int *X[], int , int );

То есть если сравнивать с одномерным массивом, то просто вместо типа int, что означает числовой целочисленный массив, записали тип int *, что означает, что в функцию передаём адрес начала массива указателей. Как правило, в качестве параметров включаются и две размерности матрицы.

Для лучшего понимания необходимо сделать следующее замечание. Как и в случае одномерного массива (FunArr), из такого прототипа ещё не следует, что мы обязательно в качестве фактического параметра должны передавать матрицу. Можно, например, передать указатель на указатель на целое число.

Для передачи матрицы в вызывающей функции создаём полностью динамическую или частично динамическую “матрицу”, а при вызове функции записываем её имя (см. дальше пример). Если продолжить аналогию с обычным одномерным числовым массивом, то в качестве первого параметра функции FunArr1 можно передать как статический массив: