[c]2차배열을 함수에서 리턴받기
1.소스코드
---------------------------------------------------
#include <stdio.h>
int(* initArray())[4] {
static int arr[4][4] = { 0 };
for (int i = 0; i < 16; i++)
*(arr[0] + i) = i + 1;
return arr;
}
int main() {
//int** arr = initArray();
int(* arr)[4] = initArray();
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
printf("%d", arr[i][j]);
return 0;
}
----------------------------------------------------------------------
- 3번줄에서 static으로 선언하지않으면 만들어놓은 배열 자체가 증발해버려서 괜히 헛메모리만 하나 낭비하는꼴이된다.
- 주석처리된부분처럼하면 배열포인터로서 넘겨줘도 그냥 일반 더블포인터로서 취급되서 아래에서처럼 배열로서의 사용이 불가능해진다. 구조상 배열포인터로의 강제승격은 불가능해보인다.
2. 참고자료 (원문 : http://kkikkodev.tistory.com/200)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 |
#include <stdio.h> #define ARR_ROW_SIZE 3 #define ARR_COL_SIZE 4 int (*ReturnArray())[ARR_COL_SIZE]; void PrintArray( int (*arr)[ARR_COL_SIZE], int row, int col); int main( int argc, char * argv[]){ int (*arr)[ARR_COL_SIZE] = ReturnArray(); PrintArray(arr, ARR_ROW_SIZE, ARR_COL_SIZE); return 0; } int (*ReturnArray())[ARR_COL_SIZE]{ static int arr[ARR_ROW_SIZE][ARR_COL_SIZE] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } }; return arr; } void PrintArray( int (*arr)[ARR_COL_SIZE], int row, int col){ int i; int j; for (i = 0; i < row; i++){ for (j = 0; j < col; j++){ printf ( "%d " , arr[i][j]); } printf ( "\n" ); } } |
6 ~ 7 라인
추후 사용할 함수들의 선언부입니다.
10 라인
int 형 2 차원 배열 포인터를 선언함과 동시에, ReturnArray 함수를 호출하여 받은 반환값으로 초기화하고 있습니다. ReturnArray 함수에서 반환하는 것이, int 형 2 차원 배열 포인터이기 때문에, 같은 형식으로 받아주고 있습니다.
11 라인
int 형 2 차원 배열 포인터와 행 개수, 열 개수를 넘기면서 PrintArray 를 호출하여 화면에 배열 요소들을 모두 출력합니다.
15 라인
ReturnArray 함수의 정의부입니다. 매개변수는 없고, 반환형이 int 형 2 차원 배열 포인터형인 (int (*)[ARR_COL_SIZE]) 이 함수는, 단순히 2 차원 배열을 선언하고, 정수값들로 초기화해서 반환하는 역할을 하고 있습니다.
16 ~ 20 라인
2 차원 배열을 선언함과 동시에 초기화하고 있습니다. 단, 지역 변수로 선언했을 경우에, 반환하면, 스택에서 사라지기 때문에, static 지역변수로 선언하여, 이 함수가 종료되어도, 메모리에 배열이 남아 있도록 하였습니다.
21 라인
선언하고 초기화한 2 차원 배열을 반환하고 있습니다. 이 함수의 반환형은, 2 차원 배열 포인터형이 됩니다.
함수의 반환형이 2 차원 배열 포인터형인 경우에는,
배열 요소의 자료형(*함수명(매개변수))[배열의 열 개수]{
}
의 형태로 함수의 정의부를 작성합니다. 이 함수를 호출하는 쪽에서도, 마찬가지로 2 차원 배열 포인터형의 변수를 선언하여 반환값을 받아주어야 합니다.
[실행 결과]