이번에는, 2 차원 배열을 함수에서 반환하고, 이를 받아보겠습니다. int 형 배열 기준으로 진행하겠습니다. (다른 자료형들도 같은 원리이기 때문입니다.) 2 차원 배열의 모든 요소를 출력하는 소스코드의 설명은 다음을 참고하시고, 이번 시간에 이 부분에 대한 설명은 생략하도록 할 예정입니다.


(2 차원 배열을 함수의 인자로 전달하기 참고)

http://kkikkodev.tistory.com/200


#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 차원 배열 포인터형의 변수를 선언하여 반환값을 받아주어야 합니다.


[실행 결과]

by kkikkodev 2015. 8. 2. 07:49