C++ Возврат массивов из функций

Массивы C++

C++ не позволяет возвращать полный массив в качестве аргумента функции. Однако можно вернуть указатель на массив, указав имя массива без индекса.

Если вы хотите вернуть одномерный массив из функции, необходимо объявить функцию, возвращающую указатель, следующим образом:

int * myFunction() { //. . . }

Следующий пример:

Пример

int* myFunction()
{
   int myArray[3] = {1, 2, 3};
   return myArray;
}

Примечание:Нельзя просто вернуть указатель на локальный массив, потому что при завершении функции локальный массив будет уничтожен, и указатель на него станет недействительным.

C++ не поддерживает возврат адреса локальной переменной за пределы функции, если локальная переменная не определена какstaticпеременная.

Чтобы избежать вышеописанной ситуации, можно использовать статический массив или динамически выделенный массив.

Использование статического массива требует создания статического массива внутри функции и возврата его адреса, например:

int* myFunction()
{
   static int myArray[3] = {1, 2, 3};
   return myArray;
}

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

Пример

#include <iostream> #include <cstdlib> #include <ctime> using namespace std; // функция для генерации и возврата случайных чисел int * getRandom( ) { static int r[10]; // Установить начальное значение srand( (unsigned)time( NULL ) ); for (int i = 0; i < 10; ++i) { r[i] = rand(); cout << r[i] << endl; } return r; } // главная функция для вызова функции, определённой выше int main () { // указатель на целое число int *p; p = getRandom(); for ( int i = 0; i < 10; i++ ) { cout << "*(p + " << i << ") : "; cout << *(p + i) << endl; } return 0; }

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

624723190
1468735695
807113585
976495677
613357504
1377296355
1530315259
1778906708
1820354158
667126415
*(p + 0) : 624723190
*(p + 1) : 1468735695
*(p + 2) : 807113585
*(p + 3) : 976495677
*(p + 4) : 613357504
*(p + 5) : 1377296355
*(p + 6) : 1530315259
*(p + 7) : 1778906708
*(p + 8) : 1820354158
*(p + 9) : 667126415

Использование динамически выделяемого массива требует использования оператора new внутри функции для выделения массива и оператора delete для освобождения массива, когда функция завершается, например:

Пример

int* myFunction()
{
   int* myArray = new int[3];
   myArray[0] = 1;
   myArray[1] = 2;
   myArray[2] = 3;
   return myArray;
}

int main()
{
   int* result = myFunction();
   // Используйте result
   delete[] result;
   return 0;
}

Ниже приведён простой пример приложения, демонстрирующий, как вернуть массив из функции:

Пример

#include <iostream>
using namespace std;

int* createArray(int size) {
    int* arr = new int[size];
    for (int i = 0; i < size; i++) {
        arr[i] = i + 1;
    }
    return arr;
}

int main() {
    int* myArray = createArray(5);
    for (int i = 0; i < 5; i++) {
        cout << myArray[i] << " ";
    }
    cout << endl;
    delete[] myArray; // освобождение памяти
    return 0;
}

В приведённом выше примере мы объявили функцию с именем createArray, которая принимает целочисленный параметр size и возвращает целочисленный массив, заполненный целыми числами. Мы использовали оператор new для динамического выделения массива в куче и заполнили массив внутри функции. В конце функция вернула указатель на массив.

В функции main мы вызвали функцию createArray и сохранили возвращённый указатель на массив в myArray. Затем мы прошли по массиву и вывели значение каждого элемента. Наконец, мы использовали оператор delete[], чтобы освободить память, занятую myArray, во избежание утечки памяти.

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

1 2 3 4 5 

Примечание:При использовании динамически выделенного массива код, вызывающий функцию, отвечает за освобождение возвращённого массива. Это связано с тем, что массив, выделенный внутри функции, не освобождается автоматически при завершении функции.

Массивы C++

Другие расширения