Как вернуть массив в функции 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++ — запись журнала для разработчиков.
вернуть указатель на двумерный массив
Здравствуйте уважаемые сишники. Имеется несколько статических двумерных массивов, все M x N. Как записать тип функции, которая вернет указатель на один из этих массивов? Очень не хочется переделывать на char**.
Aswed ★★★★★
18.02.14 22:53:09 MSK

Ctrl+A Backspace Ctrl+S Alt+F4
templarrr ★★★★★
( 18.02.14 22:55:04 MSK )

которая вернет указатель на один из этих массивов?
Может всё-таки на первый элемент?
ziemin ★★
( 18.02.14 22:55:56 MSK )
static int v[M][N], u[M][N]; int (*f(void))[M][N]
Функция f возвращает указатель на двумерный массив.
anonymous
( 18.02.14 23:03:45 MSK )
Ответ на: комментарий от anonymous 18.02.14 23:03:45 MSK
Aswed ★★★★★
( 18.02.14 23:11:03 MSK ) автор топика

в Сях(«обычных») не гарантируется проверка выхода за границу массива и даже ожидается , что таковой нет во строенных синтаксических конструкциях.
то, что нарисовал анонимус лиш «коментарий» чека на проверку что это именно прямоугольный MxN , а не вектор M*Nx1 , а не вектор 1*M*N, а ли ещё какой вариант прямоуголизации числа MxN «обычный С-компилятор» делать не обязан и как правило таковы реализации.
вообщем хоть и стёб но Брайан Керниганом:
«Почему Паскаль не является моим любимым языком программирования"
ща (да и в большинстве и тогда) эта статья не о Паскалях , а о некоторых чертах С которые должны быть в языках - и там особо подчёркивается , что не должа компилятором функция работающая с однородными наборами (ака вектора ака массивы) ограничиватся константными размерами(формами) ибо наличие таковой черты в языке убыточно для программиста-пользователя этого языка.
qulinxao ★★☆
( 19.02.14 08:55:52 MSK )

Имеется несколько статических двумерных массивов, все M x N.
в PureC не бывает многомерных массивов. Бывают массивы массивов. Ты про них?
если да, то у меня для тебя плохие новости: невозможно вернуть массив изх функции. Можно только указатель.
только так можно:
#include void print_matrix(int matrix[][3]) < int j, k; for(j = 0; j < 3; j++, printf("\n")) for(k = 0; k < 3; k++) printf("%d ", matrix[j][k]); >void gen_matrix1(int matrix[][3]) < int j, k; for(j = 0; j < 3; j++) for(k = 0; k < 3; k++) matrix[j][k] = (j==k ? 1 : 0); >int main()
Как вернуть двумерный массив из функции c
Всем привет, я запутался тут совсем, ошибку выдает:
int MAX, ***A, *LinksA; //для массива A два указателя для размерности //и еще один для передачи туда массива из функции Function int* Function(int *LinksArr) < int **arr; //двухмерный динамический массив //действия с динамическим массивом arr, где arr получит размерность return *arr; > int main() < //тут динамическим массивам A и LinksA придается размерность *A = Function(LinksA); //ну собственно само присваивание //но пишет ошибку что то вроде не могу конвертировать int* в int**. >
Форумчанин
Регистрация: 20.10.2010
Сообщений: 143
int MAX, *A, *LinksA; //для массива A два указателя для размерности //и еще один для передачи туда массива из функции Function int* Function(int *LinksArr) < int **arr; //двухмерный динамический массив //действия с динамическим массивом arr, где arr получит размерность return *arr; >int main() < //тут динамическим массивам A и LinksA придается размерность A = Function(LinksA); //ну собственно само присваивание //но пишет ошибку что то вроде не могу конвертировать int* в int**. >
451 -870-7(три)6. Выполняю работы на заказ, гарант честности - ВМ аттестат с 60+ БЛ без претензий
Пользователь
Регистрация: 10.10.2010
Сообщений: 24
хм а как тогда придать размерность для двухмерного динамического массива A, если там только один указатель?
Последний раз редактировалось Exeil; 24.10.2010 в 11:51 .
Форумчанин
Регистрация: 20.10.2010
Сообщений: 143
**A = Function(LinksA); //ну собственно само присваивание
попробуй тогда так. Когда компилятор начинает ругаться подобными еррорами - смотри где ты чего-то не учел. Насчет логичности всего этого - фиг знает, с динамикой пока не очень дружу
451 -870-7(три)6. Выполняю работы на заказ, гарант честности - ВМ аттестат с 60+ БЛ без претензий
Возвращение двумерного массива из функции в c++
Я хочу использовать двумерный массив int, который возвращается из функции, как мне определить возвращаемое значение функции? Я использовал int**, но компилятор выдавал ошибку:
int** tableCreator() < int** table=new int[10][10]; for(int xxx=1;xxx<10;xxx++)< for(int yyy=1;yyy<10;yyy++)< table[xxx][yyy]=xxx*yyy; >> return(table); //Here:cannot convert from 'int (*)[10]' to 'int **' >
Поделиться Источник 09 апреля 2013 в 17:33
4 ответа
#include #include int** createTable(int rows, int columns)< int** table = new int*[rows]; for(int i = 0; i < rows; i++) < table[i] = new int[columns]; for(int j = 0; j < columns; j++)< table[i][j] = (i+j); >// sample set value; > return table; > void freeTable(int** table, int rows) < if(table)< for(int i = 0; i < rows; i++)< if(table[i])< delete[] table[i]; >> delete[] table; > > void printTable(int** table, int rows, int columns) < for(int i = 0; i < rows; i++)< for(int j = 0; j < columns; j++)< printf("(%d,%d) ->%d\n", i, j, table[i][j]); > > > int main(int argc, char** argv)
Вам нужен второй цикл для выделения 2-d массива в C и аналогичная операция для его освобождения. Двухмерный массив по сути является массивом массивов, поэтому может быть выражен как массив указателей. Цикл инициализирует массивы, указанные в указателях.
Уточнение в соответствии с беседой с @Eric Postpischil ниже: измененный createTable для подсчета строк/столбцов для действительно динамического выделения.
Поделиться 09 апреля 2013 в 17:42
int** table=new int[10][10];
это неправильно. вы не можете выделить место для 2D динамического массива таким образом в C/C++.
В то же время, вы объявили размер массива как 10 , поэтому индексы от 0-9 , но вы пытаетесь присвоить значения индексу 10 во вложенных циклах для циклов, что также не правильно.
Вы можете сделать следующее для выделения:
int** table = new int*[10]; for (int i = 0; i
Поделиться 09 апреля 2013 в 17:34
Обычно тип, используемый для указания на массив, является указателем на элемент массива. Поскольку двумерный массив int является массивом массива int , вы хотите указатель на массив int . Синтаксис C++ для этого типа - int (*)[N] , для некоторой размерности - N . Этот код демонстрирует:
#define N 10 int (*tableCreator())[N] < int (*table)[N] = new int[N][N]; for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) table[i][j] = i*j; return table; >#include int main() < int (*t)[N] = tableCreator(); for (int i = 0; i < N; ++i) < for (int j = 0; j < N; ++j) std::cout delete [] t; return 0; >
Поделиться 09 апреля 2013 в 17:50
I. Массивы не являются указателями.
II. Почему не vector > ?
III. Если нет, то:
typedef int Int10Array[10]; Int10Array *arr = new Int10Array[10];
IV. Зачем писать через границы? Хотите явных демонов nasal?
for(int xxx = 0; xxx < 10; xxx++) ^^^ ^^^^