Как вернуть массив в функции C++
В этом уроке мы собираемся понять, как мы можем вернуть массив из функции в C++.
Методы возврата массива в функции C++
Как правило, возврат всего массива в вызов функции невозможен. Мы могли сделать это только с помощью указателей.
Более того, объявление функции с возвращаемым типом указателя и возвратом адреса массива типа C в C++ работает не во всех случаях. Компилятор выдает предупреждение о возврате локальной переменной и даже показывает ненормальное поведение на выходе.
Следовательно, вернуть массив из функции в C++ не так просто. Но мы можем добиться этого, следуя любому из нижеперечисленных методов.
Давайте приступим к делу.
1. Использование указателей
Как мы упоминали ранее, возврат обычного массива из функции с помощью указателей иногда дает нам неожиданные результаты. Но такого поведения и предупреждений можно избежать, объявив массив static .
Давайте посмотрим, как.
#include using namespace std; int* demo() //return type- address of integer array < static int a[5]; //array declared as static for(int i = 0; ireturn a; //address of a returned > int main() < int* ptr; //pointer to hold address int i; ptr = demo(); //address of a cout
Array is: 0 1 2 3 4
Здесь мы объявили функцию demo() с типом возвращаемого значения int * (указатель) и в ее определении мы вернули a ( служит как именем массива, так и базовым адресом) на место вызова функции в main() .
Как видно из приведенного выше вывода, функция успешно возвращает массив.
2. Использование структуры в C++
Мы также можем заставить функцию возвращать массив, объявив ее внутри структуры в C++. Давайте посмотрим, как.
#include using namespace std; struct demo < //array declared inside structure int arr[100]; >; struct demo func(int n) //return type is struct demo < struct demo demo_mem; //demo structure member declared for(int i=0;ireturn demo_mem; //address of structure member returned > int main() < struct demo a; int n=5; //number of elements a=func(n); //address of arr coutreturn 0; >
Array is: 0 1 2 3 4
Здесь обратите внимание, что мы объявили массив arr внутри структуры demo . И на этот раз функция имеет возвращаемый тип самой структуры и возвращает demo_mem (переменная структуры) вместо массива.
Таким образом, используя другую структурную переменную a , мы можем получить доступ к массиву arr в функции main() .
3. Использование std::array
Для std::array в C++ возврат имени массива из функции фактически означает, что весь массив возвращается на место вызова функции.
#include #include using namespace std; std::array func() //function with return type std::array < std::arrayf_array; //array declared for(int i=0;i <5;i++) < //array initialisation f_array[i] = i; >return f_array; //array returned > int main() < std::arrayarr; //array with length 5 arr=func(); //function call cout return 0; >
Array is: 0 1 2 3 4
Следовательно, из вывода видно, что возврат массива функцией func() прошел успешно.
Заключение
Итак, в этом уроке мы узнали о различных методах, с помощью которых мы можем вернуть массив из функции C++.
Если у вас возникнут дополнительные вопросы, не стесняйтесь использовать комментарии ниже.
Рекомендации
- С++ возвращает массив из функции — вопрос StackOverflow,
- Двумерный массив в C++ — запись журнала для разработчиков.
возврат массива из фу-ии Си
Здравствуйте! Можно ли сделать так на Си: int mas[2]; mas = func(); чтобы функция возвратила массив из двух целых. Если можно, то как описать данную функцию? Зарание спасибо!
anonymous
31.01.06 00:31:27 MSK
функции в си не умеет возвращать массивы. открывай учебник и кури главу "указатели"
friday ★★★
( 31.01.06 01:05:15 MSK )
можно массив обернуть в структуру. Старый Си не умел возвращать структуры, новый умеет.
dilmah ★★★★★
( 31.01.06 01:20:51 MSK )
Ответ на: комментарий от dilmah 31.01.06 01:20:51 MSK

А не проще указатель на память вернуть? Естественно, не на стек функции 🙂
anonymous_incognito ★★★★★
( 01.02.06 01:00:57 MSK )
Можно в качестве аргумента указать массив, а он передается как указатель, вот его и использовать.
stassats ★★★★
( 01.02.06 03:39:32 MSK )
Может пойдет? Почти похоже. #include int * f()< int a[2]=; int *p=a; return p; > int main()
vikeng
( 01.02.06 09:11:03 MSK )
Ответ на: комментарий от vikeng 01.02.06 09:11:03 MSK
А ничего, что f() возвращает адресс локальной переменной?
frenzy
( 01.02.06 10:44:58 MSK )
Ответ на: комментарий от frenzy 01.02.06 10:44:58 MSK
Ничего. Программа рабочая, все компилируется и работает.
vikeng
( 01.02.06 18:50:05 MSK )
Ответ на: комментарий от vikeng 01.02.06 18:50:05 MSK
vikeng: Нельзя так делать! > Программа рабочая, все компилируется и работает. А ты еще чего-нибудь вызови, она и перестанет работать. Например, попробуй такое у себя прогнать: #include #include int * f()< int a[2]=; int *p=a; return p; > int main()
Die-Hard ★★★★★
( 01.02.06 19:19:39 MSK )
Ответ на: комментарий от vikeng 01.02.06 18:50:05 MSK

> Ничего. Программа рабочая, все компилируется и работает.
Ёлки-палки, я в шутку предостерёг от выдачи адреса локальной переменной на стеке, а ты мало того что так сделал, ещё и полагаешь нормальным.
1)Локальная переменная размещается в стеке функции, т.е. в области памяти, закреплённой за функцией _только_ на время её вызова.
2)После возврата управления в вызвавшую функцию область памяти, которую занимала локальная переменная, с большой вероятностью затрёт что-нибудь ещё, она никак не удерживается за переменной.
3)Правильно будет, использовать функцию выделения памяти в куче (malloc, calloc, new, ещё что-нибудь) и работать с ней.
anonymous_incognito ★★★★★
( 01.02.06 20:54:48 MSK )
Ответ на: комментарий от anonymous_incognito 01.02.06 20:54:48 MSK
Не знал. Спасибо, что объяснили. А я-то думал, что если работает, то и проблем нет. 🙂
vikeng
( 02.02.06 08:39:01 MSK )
Вроде в чистом С нет разницы между указателями и массивами но возвратить из функции можно только ссылку на глобальный объект или указатель на память выделенную внутри тела функции
anonymous
( 02.02.06 09:21:45 MSK )
Ответ на: комментарий от anonymous 02.02.06 09:21:45 MSK

>Вроде в чистом С нет разницы между указателями и массивами
небольшая всётаки есть: например их по разному понимает sizeof()
Передача массива в функцию и возврат из функции
Особенность передачи массивов в функции в языке Си в том, что передается не сам массив, а адрес массива, который хранится в локальном указателе на него.
Это можно сделать по-разному, но результат будет одинаковый:
- void some_function(int array[]);
- void some_function(int *array);
При этом обязательно нужно указать тип элемента массива.
Размер массива в функцию автоматически не передается, поэтому если размер массива заранее (на этапе компиляции) не оговорен, то нужно передать параметр, который содержит количество элементов в массиве, например number_of_elements:
void some_function(int array[], int number_of_elements);
Следующая программа передает массивы в функцию show_array, которая использует цикл for для вывода значений массивов:
show_array.c
void show_array (int array [], int number_of_elements)
for ( int i = 0; i < number_of_elements; i++) printf("%d\t", array[i]);
>
printf("\n");
>
int main()
int little_numbers[5] = ;
int big_numbers[3] = ;
show_array(little_numbers, 5);
show_array(big_numbers, 3);
>
Массив просто передается в функцию по имени (а его имя — это адрес первого элемента), а также указывает параметр, который сообщает функции количество элементов, содержащихся в массиве:
Изменение массива из функции
Возможно ли поменять значения элементов из функции?
Ответ положительный — да, это возможно, причем ничего дополнительно для этого указывать не нужно, так как в функцию передается адрес массива, а не сами значения, то и доступ происходит к тем же самым элементам, а не к их копиям.
Следующая программа использует функцию get_values, чтобы присвоить три значения массиву numbers:
values_from_keyboard.c
#include
void read_array(int array[], int number_of_elements)
for(int i = 0; i < number_of_elements; i++)
printf("Введите значение №%d: ", i);
scanf("%d", &array[i]);
>
>
int main()
int numbers[3] = ;
read_array (numbers, 3); //массив будет изменен!
printf(" Значения массива\n");
for (int i = 0; i < 3; i++) printf(" numbers [%d] \n", i);
>
Как видите, программа передает массив в функцию по имени, а функция присваивает массиву элементы.
Таким образом, функция может изменить элементы массива, если ей это нужно.
Как вернуть массив из функции c
Начал изучать массивы и указатели в C, и не могу решить проблему, суть которой в том, что функция должна возвращать массив, и она его возвращает, но не в том виде, в котором нужно. Ниже - код и вывод программы
#include int * initArray() < int resultArray[5]; int i; time_t t; for (i = 0; iprintf ("From Init %d\t", resultArray[i]); printf ("\n"); > //Вернется УКАЗАТЕЛЬ НА ПЕРВЫЙ ЭЛЕМЕНТ resultArray[0] return &resultArray; > void outArray (int *out) < int curIndex; for (curIndex = 0; curIndex < 5; curIndex++ ) < printf ("%d\t", (*out) + curIndex ); >> void main (void) < array[5] = initArray(); printf("Первый элемент = %d\n", *array ); printf ("Массив ["); //array - это указатель на первый элемент массива outArray(array); printf ("]\n"); >
From Init 8 From Init 6 From Init 8 From Init 2 From Init 0 From Init 0 Первый элемент = -1218272211 Массив [-1218272211 -1218272210 -1218272209 -1218272208 -1218272207 ]
Вобщем немного запутался с указателями. Заранее спасибо за помощь.
Цифровой кот
Регистрация: 29.08.2014
Сообщений: 7,656
int resultArray[5]; - это статический массив из 5 элементов int. функция возвращает значение указателя на начало этого массива. но косяк в том, что resultArray – локальная переменная, после выхода из области видимости в этих 5 элементах может расположиться любой мусор, но указатель и теперь указывает правильный адрес – тот самый, который функция вернула наружу.
поэтому не надо так делать, это лишний головняк. передавай массивы в функции и из функций по ссылке. если необходимо вернуть новый указатель, выделяй память в функциях динамически и не забывай её возвращать системе обратно за пределами функций, выделяющих память.
з.ы. я художник, я так вижу!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана.