https://ko.linux-console.net/?p=6025#gsc.tab=0
이 자습서에서는 C++의 함수에서 배열을 반환하는 방법을 이해할 것입니다.
일반적으로 전체 배열을 함수 호출로 반환하는 것은 불가능합니다. 포인터를 사용해야만 할 수 있습니다.
게다가 반환 유형이 포인터인 함수를 선언하고 C++에서 C 유형 배열의 주소를 반환하는 것은 모든 경우에 작동하지 않습니다. 컴파일러는 지역 변수 반환에 대한 경고를 발생시키고 심지어 출력에 일부 비정상적인 동작을 표시합니다.
따라서 C++의 함수에서 배열을 반환하는 것은 그리 쉬운 일이 아닙니다. 그러나 아래 언급된 방법 중 하나를 따르면 이를 달성할 수 있습니다.
바로 시작합시다.
앞에서 언급했듯이 포인터를 사용하여 함수에서 일반 배열을 반환하면 때때로 예기치 않은 결과가 발생합니다. 그러나 이 동작과 경고는 배열을 정적
배열로 선언함으로써 피할 수 있습니다.
방법을 살펴보겠습니다.
#include<iostream>
using namespace std;
int* demo() //return type- address of integer array
{
static int a[5]; //array declared as static
for(int i = 0; i<5; i++)
{
a[i] = i; //array initialisation
}
return a; //address of a returned
}
int main()
{
int* ptr; //pointer to hold address
int i;
ptr = demo(); //address of a
cout<<"Array is: ";
for(i=0 ; i<5; i++)
cout<<ptr[i]<<"\t"; //ptr[i] is equivalent to *(ptr+i)
return 0;
}
산출:
Array is: 0 1 2 3 4
여기에서 demo()
함수를 반환 유형 int *
(포인터)로 선언했으며 그 정의에서 a
를 반환했습니다( main()
에서 함수 호출 사이트에 대한 배열 이름 및 기본 주소로 사용됨).
위 출력에서 볼 수 있듯이 배열은 함수에 의해 성공적으로 반환됩니다.
또한 C++의 구조체 내부에 선언하여 함수가 배열을 반환하도록 만들 수 있습니다. 방법을 살펴보겠습니다.
#include <iostream>
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;i<n;i++)
{
//array initialisation
demo_mem.arr[i] = i;
}
return demo_mem; //address of structure member returned
}
int main()
{
struct demo a;
int n=5; //number of elements
a=func(n); //address of arr
cout<<"The Array is : ";
for(int i=0;i<n;i++)
{
cout<<a.arr[i]<<"\t";
}
return 0;
}
산출:
Array is: 0 1 2 3 4
여기에서 demo
구조 내부에 arr
배열을 선언했음을 주목하십시오. 그리고 이번에는 함수가 구조체 자체의 반환 유형을 가지며 배열 대신 demo_mem
(구조 변수)을 반환합니다.
이와 같이 다른 구조 변수 a
를 사용하여 main()
함수에서 배열 arr
에 액세스할 수 있습니다.
C++의 std::array
의 경우 함수에서 배열 이름을 반환하면 실제로 함수 호출 사이트로 반환되는 전체 배열로 변환됩니다.
#include <iostream>
#include<array>
using namespace std;
std::array<int,5> func() //function with return type std::array
{
std::array<int,5> f_array; //array declared
for(int i=0;i<5;i++)
{
//array initialisation
f_array[i] = i;
}
return f_array; //array returned
}
int main()
{
std::array<int,5> arr; //array with length 5
arr=func(); //function call
cout<<"The Array is : ";
for(int i=0;i<5;i++)
{
cout<<arr[i]<<"\t";
}
return 0;
}
산출:
Array is: 0 1 2 3 4
따라서 func()
함수에 의한 배열 반환이 성공적이라는 것이 출력에서 분명합니다.
따라서 이 자습서에서는 C++ 함수에서 배열을 반환할 수 있는 다양한 방법에 대해 배웠습니다.
추가 질문이 있으시면 아래 의견을 자유롭게 사용하십시오.
가정 : array<int, 10> arr = {1,2,3,4,5,6,7,8,9,10};으로 arr 변수 명을 사용했다고 가정
함수 이름 | 함수 설명 | 함수 원형 |
arr.begin() | 배열의 맨 첫번째 원소를 가리킴 (iterator와 사용) | iterator begin() noexcept; |
arr.end() | 배열의 맨 마지막 "다음" 원소를 가리킴 (with iterator) | iterator end() noexcept; |
arr.rbegin() | 배열을 거꾸로 했을때 첫번째 원소를 가리킴(with iterator) | reverse_iterator rbegin() noexcept; |
arr.rend() | 배열을 거꾸로 했을때 마지막의 "다음" 원소를 가리킴 (with iterator) | reverse_iterator rend() noexcept; |
arr.cbegin(), cend() | 위쪽 begin, end와 같지만 const가 붙어서 iterator를 이용해서 원소를 수정할 수 없음 | const_iterator --() noexcept; |
arr.crbegin(), crend() | 위와 동일 | const_reverse_iterator --() nocept; |
arr.front() | 배열의 맨 앞의 원소를 반환 | reference front(); |
arr.back() | 배열의 맨 뒤의 원소를 반환 | reference back(); |
arr.data() | 배열의 포인터 타입으로 반환(배열의 첫번째 주소를 반환) | value_type* data() noexcept; |
arr.fill(val) | 배열의 인자를 val으로 다 바꿔줌 | void fill(const value_type& val); |
arr.swap(arr2) | arr2의 배열 인자와 arr의 인자들을 교체 (이때, 길이와 타입이 같아야함) | void swap(array& arr) noexcept....; |
arr.at(N) | N번째 인자를 반환 | reference operator ar(size_type n); |
arr[N] | N번째 인자를 반환 | reference operator[](size_type n); |
arr.empty() | 비어있는지 확인 | constexpr bool empty() noexcept; |
arr.max_size() | 배열의 최대 사이즈를 반환(size와 같음) | constexpr size_type max_size() noexcept; |
arr.size() | 배열의 사이즈를 반환(max_size와 같음) | constexpr size_type size() noexcept; |