Массив — это набор данных подобного типа, хранящихся в непрерывной памяти. И когда мы храним массив внутри массива, он называется 2D-массивом или 2-мерным массивом. Чтобы узнать больше о массивах, обратитесь к статье Массивы в C++.
Когда есть необходимость вернуть 2D-массив из функции, всегда трудно найти способ сделать это, и причина, по которой это сложно, заключается в том, что когда мы возвращаем массив, локальный для некоторой функции, он возвращает только адрес этого массива. и как только функция возвращает адрес завершена, и мы достигли места, где мы ее вызвали. Затем операционная система уничтожит всю память, которая была создана в этой функции, поэтому в этом случае массив, который мы получаем из этого, также уничтожается, и мы сохраняем адрес недопустимой области памяти.
Итак, в этой статье мы увидим, как справиться с этой проблемой.
Методы возврата 2D-массива из функции
здесь мы увидим возврат 2D-массива из функции с использованием следующих методов:
- Использование динамического массива
- Использование статического ключевого слова
- Использование техники Struct
1. Возврат 2D-массива из функции в C++ с использованием динамического массива
Динамический массив помогает нам хранить адреса массивов с помощью указателя. Таким образом, мы можем использовать динамический массив для использования нотации указателя на указатель для динамического выделения и возврата массива. Чтобы узнать больше о динамическом массиве, обратитесь к Динамический массив в C++.
Ниже приведена реализация вышеуказанного подхода
С++
// C++ code for returning 2D array
// from function using Dynamic array
#include <iostream>
using
namespace
std;
const
int
N = 3;
// function to display array
void
printArray(
int
** arr)
{
for
(
int
i = 0; i < N; ++i) {
for
(
int
j = 0; j < N; ++j) {
cout << arr[i][j]<<
" "
;
}
cout << endl;
}
}
// function to initialize and returning array
int
** getArray()
{
int
** arr =
new
int
*[N];
for
(
int
i = 0; i < N; ++i) {
arr[i] =
new
int
[N];
for
(
int
j = 0; j < N; ++j) {
arr[i][j] = i + j;
}
}
return
arr;
}
// Driver Code
int
main()
{
int
** arr;
arr = getArray();
printArray(arr);
return
0;
}
Вывод
0 1 2
1 2 3
2 3 4
2. Возврат 2D-массива из функции в C++ с использованием статического ключевого слова
Ключевое слово static используется, чтобы сделать память элемента статической, что означает, что даже когда он передается функции, он использует тот же элемент памяти, а не создает копию элемента. Чтобы узнать больше о статических ключевых словах, обратитесь к ключевому слову static в C++.
Ниже приведена реализация вышеуказанного подхода
С++
// C++ code for returning 2D array
// from function using static keyword
#include <iostream>
using
namespace
std;
const
int
N = 3;
// function for display array
void
printArray(
int
arr[][N])
{
for
(
int
i = 0; i < N; ++i) {
for
(
int
j = 0; j < N; ++j) {
cout << arr[i][j]<<
" "
;
}
cout << endl;
}
}
// function to initialize and returning array
int
(*(getArray)())[N]
{
static
int
arr[N][N]
= { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 } };
return
arr;
}
// Driver code
int
main()
{
int
(*arr)[N];
arr = getArray();
printArray(arr);
return
0;
}
Вывод
0 1 2 3 4 5 6 7 8
3. Возврат 2D-массива из функции в C++ с использованием техники Struct
Struct — это определяемый пользователем тип данных, который может хранить несколько элементов, связанных вместе, и действует как единое целое. Итак, мы можем использовать структуру с массивом внутри как единицу для выполнения любой операции и возвращать ее как единицу.
Ниже приведена реализация вышеуказанного подхода
С++
// C++ code for returning 2D array
// from function using static keyword
#include <iostream>
using
namespace
std;
const
int
N = 3;
// structure of array
struct
ArrStruct {
int
arr[N][N];
};
// function for display array
void
printArray(ArrStruct var)
{
for
(
int
i = 0; i < N; ++i) {
for
(
int
j = 0; j < N; ++j) {
cout << var.arr[i][j] <<
" "
;
}
cout << endl;
}
}
// function to initialize and returning array
ArrStruct getArray()
{
ArrStruct var;
for
(
int
i = 0; i < N; ++i) {
for
(
int
j = 0; j < N; ++j) {
var.arr[i][j] = i + j;
}
}
return
var;
}
// Driver code
int
main()
{
ArrStruct arr;
arr = getArray();
printArray(arr);
return
0;
}
Вывод
0 1 2 1 2 3 2 3 4
Здравствуйте. В приведенных Вами примерах нет самого главного- ПЕРЕМЕННОЙ N. Ибо если массив динамический, то я должен его сформировать внутри функции и передать головной программе сам массив и его размер. Хватило бы одномерного массива переменной длины, длина которого формировалась бы внутри функции (генератор случайных чисел или чтение из файла). Навскидку не сможете подсказать вариант?