Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
П_5_6.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.37 Mб
Скачать

Б) Функция возвращает указатель на первый элемент одномерного массива

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

type*имя = new type[размер_массива];

Таким образом, указатель связывается с участком памяти, выделяемым динамически для массива данных.

Такой указатель может возвращать с помощью оператора return функция, в которой формируется динамический одномерный массив, тем самым, возвращая “указатель на одномерный динамический массив”.

Пример: определить и вызвать функцию, формирующую одномерный динамический массив, заполняя его значениями, вводимыми с клавиатуры. Формальный параметр функции – количество элементов в формируемом массиве. Функция возвращает указатель на первый элемент массива.

int * vvod ( int n) // параметр функции –количество элементов массива,

// функция возвращает значение указателя (адреса),

//первого элемента формируемого динамического массивом;

{

int* p ; // указатель на элемент формирующегося массива;

p = new int [n] ; // динамическое выделение памяти под массив,

//адрес участка памяти присваивается указателю p;

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

cin >> p[i] ;

return p ; //возвращается указатель (адрес) на первый элемент массива;

}

void main ( )

{

int * dat , n ; // объявляется указатель на элемент массива и

//количество элементов;

cin >> n; // вводится с клавиатуры количество элементов;

dat = vvod (n) ; //указателю присваивается результат вызова функции;

for ( int i=0 ; i < n ; i++ ) // поэлементный вывод на экран элементов

cout << dat[i]<<’\t ‘; // сформированного массива;

. . .

delete dat ; // динамическое освобождение памяти;

}

в) - Функция возвращает указатель на указатель на элемент массива

Многомерный массив с переменными размерами, сформированный в функции, вернуть в вызывающую программу как результат функции непосредственно невозможно.

Однако возвращающим значением функции может быть указатель на одномерный массив указателей на одномерные массивы (“двойной указатель”).

Двумерный массив можно рассматривать как одномерный массив одномерных массивов – строк массива. Действительно, с этой точки зрения, если в массиве m строк и n столбцов, двумерный массив представляет собой m одномерных массивов, в которых по n элементов.

При динамическом выделении памяти на двумерный массив надо m раз выделить память на одномерные массивы – строки матрицы, так как это было описано в предыдущем разделе. Для этого понадобиться m указателей на элементы массива, причем m может быть заранее не известно. С помощью указателя на указатель на элемент массива возможно формирование динамического одномерного массива указателей. Если затем каждый указатель такого массива “связать” с участком памяти, выделяемым динамически на одну строку данных, то будет выделена память на двумерный массив, количество строк в котором равно количеству указателей в динамическом массиве указателей.

И именно этот указатель на указатель можно возвратить с помощью оператора return из функции, которая формирует двумерный динамический массив, и тем самым возвратить “указатель на двумерный массив”.

Пример: определить и вызвать функцию, формирующую и возвращающую двумерный динамический массив натуральных чисел, размеры массива – аргументы функции.

int ** mas ( int m , int n ) // параметры функции – количество строк и

// столбцов массива, функция возвращает значение указателя на указатель;

{ int k=1;

int ** ptr ; // указатель на указатель на элемент

ptr = new int* [m ] ; // указателю присваивается адрес участка памяти,

// выделенного на динамический массив из m указателей;

for ( int i=0 ; i < m ; i++ ) //затем в цикле

ptr [i] = new int [ n] // каждому указателю массива указателей

//присваивается адрес участка памяти, который динамически

//выделяется на каждую строку двумерного массива,

//состоящую из n элементов типа int;

for ( int i =0 ; i < m ; i++ ) // поэлементное заполнение массива

// последовательными натуральными числами

// и вывод его элементов;

{ cout <<”\n” ;

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

{ ptr [ i] [j] = k++ ; cout << ptr [i][j] << “ “ ; }

}

return ptr ; // возвращается указатель на указатель или

// “указатель на матрицу”;

}

void main ( )

{

int n , m ,i ,j;

cout<<”Введите количество строк и столбцов массива\n”;

cin>> n>>m; // размеры массива вводятся с клавиатуры;

int ** Q; // определен двойной указатель для формируемой матрицу;

Q = mas ( m , n ) ; //указателю присваивается результат вызова функции;

. . .

Q[i][j] // обращение к элементам динамического массива

. . .

// освобождение памяти

for ( i=0 ; i < m ; i++ ) // сначала освобождается память, выделенная под

delete Q[i] ; //каждую строку данных массива;

delete [ ] Q; //освобождается память, выделенная под массив указателей

//на строки массива;

}