64.2 2차원 배열 매개변수 사용하기

함수에서 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;
}

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