C언어 2차원 배열 반환 - ceon-eo 2chawon baeyeol banhwan


함수에서 2차원 배열을 매개변수로 사용하려면 ( ) (괄호) 안에서 매개변수 이름 뒤에 [ ][가로크기] (대괄호)를 두 개 붙이고 가로 크기를 지정하거나 괄호로 묶은 포인터 뒤에 [ ]를 붙이고 가로 크기를 지정합니다.

반환값자료형 함수이름(자료형 매개변수[][가로크기]) { } 반환값자료형 함수이름(자료형 (*매개변수)[가로크기]) { }

다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

parameter_two_dimensional_array.c

#include <stdio.h> // ↓ 배열의 가로 크기 지정 void print2DArray(int arr[][5], int col, int row) // 2차원 배열의 포인터와 가로, 세로 크기를 받음 { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } int main() { int numArr[2][5] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 } }; int col = sizeof(numArr[0]) / sizeof(int); // 5: 2차원 배열의 가로 크기를 구할 때는 // 가로 한 줄을 요소의 크기로 나눠줌 int row = sizeof(numArr) / sizeof(numArr[0]); // 2: 2차원 배열의 세로 크기를 구할 때는 // 배열이 차지하는 공간을 가로 한 줄의 크기로 나눠줌 print2DArray(numArr, col, row); // 2차원 배열과 가로, 세로 크기를 넣음 return 0; }

실행 결과

1 2 3 4 5 6 7 8 9 10

함수에서 2차원 배열을 매개변수로 사용할 때는 매개변수 이름 뒤에 []를 두 개 붙이고 두 번째 대괄호에는 배열의 가로 크기를 지정해야 합니다(첫 번째 대괄호 안에는 세로 크기를 지정하더라도 무시됩니다). 즉, arr[][5]는 2차원 배열의 메모리 주소를 담고 있는 포인터이며 2차원 배열의 실제 크기를 알 수 없으므로 다른 매개변수로 배열의 가로, 세로 크기를 받아야 합니다.

void print2DArray(int arr[][5], int col, int row) // 2차원 배열의 포인터와 가로, 세로 크기를 받음

print2DArray를 사용할 때는 2차원 배열과 가로, 세로 크기를 넣습니다. 여기서 가로 크기를 구할 때는 가로 한 줄을 요소(자료형)의 크기로 나누면 되고, 세로 크기를 구할 때는 배열이 차지하는 공간을 가로 한 줄의 크기로 나눠주면 됩니다.

int numArr[2][5] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 } }; int col = sizeof(numArr[0]) / sizeof(int); // 5: 2차원 배열의 가로 크기를 구할 때는 // 가로 한 줄을 요소의 크기로 나눠줌 int row = sizeof(numArr) / sizeof(numArr[0]); // 2: 2차원 배열의 세로 크기를 구할 때는 // 배열이 차지하는 공간을 가로 한 줄의 크기로 나눠줌 print2DArray(numArr, col, row); // 2차원 배열과 가로, 세로 크기를 넣음

print2DArray 안에서는 매개변수 arrcol, row를 사용하여 2차원 배열의 요소를 출력할 수 있습니다.

void print2DArray(int arr[][4], int col, int row) // 2차원 배열의 포인터와 가로, 세로 크기를 받음 { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf("%d ", arr[i][j]); } printf("\n"); } }

arr도 포인터이므로 함수 안에서 2차원 배열의 요소를 변경하면 함수 바깥에 있는 2차원 배열의 요소가 바뀌겠죠?

2차원 배열을 매개변수로 사용할 때는 포인터와 대괄호를 사용할 수도 있습니다.

parameter_two_dimensional_pointer_array.c

#include <stdio.h> void print2DArray(int (*arr)[5], int col, int row) // 매개변수를 포인터로 만든 뒤 가로 크기 지정 { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } int main() { int numArr[2][5] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 } }; int col = sizeof(numArr[0]) / sizeof(int); // 5: 2차원 배열의 가로 크기를 구할 때는 // 가로 한 줄을 요소의 크기로 나눠줌 int row = sizeof(numArr) / sizeof(numArr[0]); // 2: 2차원 배열의 세로 크기를 구할 때는 // 배열이 차지하는 공간을 가로 한 줄의 크기로 나눠줌 print2DArray(numArr, col, row); // 2차원 배열과 가로, 세로 크기를 넣음 return 0; }

실행 결과

1 2 3 4 5 6 7 8 9 10

int (*arr)[5]와 같이 int형 배열의 포인터로 지정하면 2차원 배열을 매개변수로 사용할 수 있습니다. 또한, 대괄호를 두 개 붙일 때와 마찬가지로 대괄호 안에는 2차원 배열의 가로 크기를 지정합니다. 여기서 주의할 점은 (*arr)[5]와 같이 포인터를 괄호로 묶어서 배열의 포인터라는 점을 명확하게 표시해야 합니다. 그리고 포인터로는 2차원 배열의 크기를 알 수 없으므로 다른 매개변수를 통해 배열의 가로, 세로 크기를 받습니다.

void print2DArray(int (*arr)[5], int col, int row) // 매개변수를 포인터로 만든 뒤 가로 크기 지정

참고 | 복합 리터럴 사용하기(2차원 배열)

복합 리터럴을 사용하면 2차원 배열도 함수에 넘겨줄 수 있습니다.

  • (자료형)[][가로크기] { { 값1, 값2, 값3 }, { 값4, 값5, 값6 } }
  • (자료형)[세로크기][가로크기] { { 값1, 값2, 값3 }, { 값4, 값5, 값6 } }

compound_literal_two_dimensional_array.c

#include <stdio.h> void print2DArray(int (*arr)[5], int col, int row) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } int main() { // 복합 리터럴 방식으로 2차원 배열을 넘겨줌 print2DArray((int[2][5]) { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 } }, 5, 2); return 0; }

지금까지 함수에서 배열 매개변수를 사용하는 방법을 배웠는데 실제로 함수에 배열을 전달하는 것은 생각보다 까다롭습니다. 당장은 문법과 개념을 모두 이해하지 않아도 됩니다. 나중에 함수에서 배열을 전달해야 된다면 다시 돌아와서 찾아보면 됩니다.


Toplist

최신 우편물

태그