함수에서 1차원 배열을 반환할때에는 단순히 해당 포인터를 반환하면 된다
그러면 2차원 배열을 반환할때는 어떻게 해야할까?
#ads_1
얼핏 아래처럼 하면 될 줄 알았다.
char** func(void){
static char a[2][10] = {"aaaa", "bbbb"};
return a;
}
이런 제길 return a; 에서 a가 반환값 형식과 맞지 않는다고 빨간지렁이들이 글자밑에 꾸물꾸물 나타났다 -_-;;
그럼 도대체 어떻게 해야 하는가???
정답은 배열포인터를 사용하면된다.
배열의 주소를 가진 포인터!!
typedef char (*Temp)[10];
Temp func(){
static char a[][10] = {"aaaa", "bbbb"};
return a;
}
char (*Temp)[10]
참 해괴한 문법이긴 하다. 얼핏보면 이해가 안되는 문법이다.
왜 이렇게 해괴한 문법을 사용해야만 했을까?
배열포인터와 포인터배열을 구분을 하려다보니 어쩔 수 없었던 모양이다.
즉, 아래의 뜻과 같다.
포인터배열 : *arr[10] //10개의 포인터를 저장할 수 있는 배열
배열포인터 : (*arr)[10] //10개의 요소를 가진 배열의 주소를 저장할 수 있는 포인터
이와 같이 typedef 로 배열포인터를 정의해 주고 그걸 리턴타입으로 사용하면 된다.
그리고 호출하는 쪽에서도 역시 아래와 같이 배열포인터로 받아야 한다.
char (*arr)[10] = func();
cout << arr[0] << endl; //aaaa 출력
cout << arr[1] << endl; //bbbb 출력
이제 2차원 배열도 반환할 수 있다 ^^
#ads_1
하지만! 이것도 귀찮다면 아래와 같이 축약형태로 사용할 수도 있다.
char (*func(void))[10]{
static char a[][10] = {"aaaa", "bbbb"};
return a;
}
헐~ 코드량은 줄었지만 더 알아보기 힘들다 ㅠㅠ.
두개의 형태중 이해하기 쉬운쪽으로 사용하면 될것이다.
다음은 이를 이용한 다차원배열을 리턴하는 예제이다
#include <iostream>
#include <conio.h>
using namespace std;
//1차원배열의 반환
char *func(void){
static char a[10] = "abcdefg";
return a;
}
//2차원배열의 반환
char (*func2(void))[10]{
static char a[][10] = {"xxx", "yyy", "zzz"};
return a;
}
//3차원배열의 반환
char (*func3(void))[4][10]{
static char a[][4][10] = {
{"abcd", "efg", "hijk", "lmn"},
{"aaa", "bbb", "ccc", "ddd"}
};
return a;
}
int main(){
char *arr1 = func();
cout << arr1 << endl; //abcdefg
cout << "-------------------" << endl;
char (*arr2)[10] = func2();
cout << arr2[0] << endl; //xxx
cout << arr2[1] << endl; //yyy
cout << arr2[2] << endl; //zzz
cout << "-------------------" << endl;
char (*arr3)[4][10] = func3();
cout << arr3[0][0] << endl; //abcd
cout << arr3[1][3] << endl; //ddd
return 0;
}
※ 참고로 배열을 static으로 선언한 이유는 다 아다시피 함수를 벗어나면 함수내에 지역변수로 선언한 배열이 날아가버리기 때문에 static으로 선언했다.
new 나 malloc으로 배열을 생성해도 되지만 사용후 해제해 주어야 하기 때문에 귀찮다
#ads_1