profile image

L o a d i n g . . .

Unit 37. 2차원 배열 사용하기

 

37.1 2차원 배열을 선언하고 요소에 접근하기

2차원 배열 [ ] (대괄호)를 두 번 사용하여 선언하며 첫 번째 대괄호에는 세로 크기, 두 번째 대괄호에는 가로 크기를 지정한다.

 - 자료형 배열이름[세로크기][가로크기];

 - 자료형 배열이름[세로크기][가로크기] = { { 값, 값, 값 }, {값, 값, 값} };

 

2차원 배열의 요소에 접근하려면 배열 뒤에 [ ] (대괄호)를 두 번 사용하며 [ ] 안에 세로와 가로 인덱스를 지정해주면 된다.

 - 배열[세로인덱스][가로인덱스]

 

#include <stdio.h>

int main()
{
    int numArr[3][4] = {    // 세로 크기 3, 가로 크기 4인 int형 2차원 배열 선언
        { 11, 22, 33, 44 },
        { 55, 66, 77, 88 },
        { 99, 110, 121, 132 }
    };
                       // ↓ 세로 인덱스
    printf("%d\n", numArr[0][0]);    // 11 : 세로 인덱스 0, 가로 인덱스 0인 요소 출력
    printf("%d\n", numArr[1][2]);    // 77 : 세로 인덱스 1, 가로 인덱스 2인 요소 출력
    printf("%d\n", numArr[2][0]);    // 99 : 세로 인덱스 2, 가로 인덱스 0인 요소 출력
    printf("%d\n", numArr[2][3]);    // 132: 세로 인덱스 2, 가로 인덱스 2인 요소 출력
                          // ↑ 가로 인덱스

    return 0;
}

다음은 세로 크기 3, 가로 크기 4인 int형 2차원 배열을 선언하고, 값을 초기화 한 것이다.

2차원 배열도 인덱스는 0부터 시작한다. 따라서 배열 numArr의 가로 첫 번째, 세로 첫 번째 요소는 numArr[0][0]이 된다.

 

 

37.2 2차원 배열을 초기화하기

#include <stdio.h>

int main()
{
    int numArr[3][4] = { 0, };       // 2차원 배열의 요소를 모두 0으로 초기화

    printf("%d\n", numArr[0][0]);    // 0: 세로 인덱스 0, 가로 인덱스 0인 요소 출력
    printf("%d\n", numArr[1][2]);    // 0: 세로 인덱스 1, 가로 인덱스 2인 요소 출력
    printf("%d\n", numArr[2][0]);    // 0: 세로 인덱스 2, 가로 인덱스 0인 요소 출력
    printf("%d\n", numArr[2][3]);    // 0: 세로 인덱스 2, 가로 인덱스 3인 요소 출력

    return 0;
}

2차원 배열을 선언할 때도 { 0, }을 할당하여 배열의 요소를 모두 0으로 초기화하면 된다.

 

 

37.3 2차원 배열의 요소에 값 할당하기

#include <stdio.h>

int main()
{
    int numArr[3][4];

    numArr[0][0] = 11;    // 세로 인덱스 0, 가로 인덱스 0인 요소에 값 할당
    numArr[0][1] = 22;    // 세로 인덱스 0, 가로 인덱스 1인 요소에 값 할당
    numArr[0][2] = 33;    // 세로 인덱스 0, 가로 인덱스 2인 요소에 값 할당
    numArr[0][3] = 44;    // 세로 인덱스 0, 가로 인덱스 3인 요소에 값 할당

    numArr[1][0] = 55;    // 세로 인덱스 1, 가로 인덱스 0인 요소에 값 할당
    numArr[1][1] = 66;    // 세로 인덱스 1, 가로 인덱스 1인 요소에 값 할당
    numArr[1][2] = 77;    // 세로 인덱스 1, 가로 인덱스 2인 요소에 값 할당
    numArr[1][3] = 88;    // 세로 인덱스 1, 가로 인덱스 3인 요소에 값 할당

    numArr[2][0] = 99;    // 세로 인덱스 2, 가로 인덱스 0인 요소에 값 할당
    numArr[2][1] = 110;   // 세로 인덱스 2, 가로 인덱스 1인 요소에 값 할당
    numArr[2][2] = 121;   // 세로 인덱스 2, 가로 인덱스 2인 요소에 값 할당
    numArr[2][3] = 132;   // 세로 인덱스 2, 가로 인덱스 3인 요소에 값 할당

    printf("%d\n", numArr[0][0]);    // 11 : 세로 인덱스 0, 가로 인덱스 0인 요소 출력
    printf("%d\n", numArr[1][2]);    // 77 : 세로 인덱스 1, 가로 인덱스 2인 요소 출력
    printf("%d\n", numArr[2][0]);    // 99 : 세로 인덱스 2, 가로 인덱스 0인 요소 출력
    printf("%d\n", numArr[2][3]);    // 132: 세로 인덱스 2, 가로 인덱스 3인 요소 출력

    return 0;
}

2차원 배열 역시 세로 인덱스와 가로 인덱스를 통해 배열의 요소에 각각 값을 할당할 수 있다.

 - 배열[세로인덱스][가로인덱스] = 값;

 

 

37.4 2차원 배열의 크기 구하기

2차원 배열의 가로, 세로 크기를 구해놓고 반복문에 사용하면 실수를 방지할 수 있다.

2차원 배열이 차지하는 전체 공간과 가로, 세로 요소의 개수는 sizeof 연산자로 구할 수 있다.

#include <stdio.h>

int main()
{
    int numArr[3][4] = {    // 세로 크기 3, 가로 크기 4인 int형 2차원 배열 선언
        { 11, 22, 33, 44 },
        { 55, 66, 77, 88 },
        { 99, 110, 121, 132 }
    };

    printf("%d\n", sizeof(numArr));    // 48: 4바이트 크기의 요소가 12(4*3)개이므로 48

    int col = sizeof(numArr[0]) / sizeof(int);    // 4: 2차원 배열의 가로 크기를 구할 때는 
                                                  // 가로 한 줄의 크기를 요소의 크기로 나눠줌

    int row = sizeof(numArr) / sizeof(numArr[0]); // 3: 2차원 배열의 세로 크기를 구할 때는 
                                    // 배열이 차지하는 전체 공간을 가로 한 줄의 크기로 나눠줌

    printf("%d\n", col);    // 4
    printf("%d\n", row);    // 3

    return 0;
}

sizeof로 2차원 배열의 크기를 구해보면 배열이 차지하는 전체 공간이 출력됩니다.

가로(column, 열)의 요소 개수를 구하려면 sizeof(numArr[0])와 같이 가로 한 줄의 크기를 구한 뒤 자료형의 크기로 나누면 됩니다.

세로(row, 행)의 요소 개수배열이 차지하는 전체 공간을 가로 한 줄의 크기로 나눠주면 된다.

 

 

37.5 반복문으로 2차원 배열의 요소를 모두 출력하기

#include <stdio.h>

int main()
{
    int numArr[3][4] = {    // 세로 크기 3, 가로 크기 4인 int형 2차원 배열 선언
        { 11, 22, 33, 44 },
        { 55, 66, 77, 88 },
        { 99, 110, 121, 132 }
    };

    int col = sizeof(numArr[0]) / sizeof(int);    // 4: 2차원 배열의 가로 크기를 구할 때는 
                                                  // 가로 한 줄의 크기를 요소의 크기로 나눠줌

    int row = sizeof(numArr) / sizeof(numArr[0]); // 3: 2차원 배열의 세로 크기를 구할 때는 
                                    // 배열이 차지하는 전체 공간을 가로 한 줄의 크기로 나눠줌

    for (int i = 0; i < row; i++)    // 2차원 배열의 세로 크기만큼 반복
    {
        for (int j = 0; j < col; j++)    // 2차원 배열의 가로 크기만큼 반복
        {
            printf("%d ", numArr[i][j]); // 2차원 배열의 인덱스에 반복문의 변수 i, j를 지정
        }
        printf("\n");                // 가로 요소를 출력한 뒤 다음 줄로 넘어감
    }

    return 0;
}

먼저 배열의 세로 크기와 가로 크기를 구해준다. 그리고 for 반복문으로 세로부터 반복한 뒤 가로를 반복하면서 2차원 배열의 요소를 출력한다.

반복문의 변수 i j는 변화식을 통해 1씩 증가하므로 2차원 배열의 세로 인덱스에는 i, 가로 인덱스에는 j를 넣으면 배열의 요소를 순서대로 접근할 수 있다.

 

 

37.6 2차원 배열을 포인터에 넣기

2차원 배열을 포인터에 담으려면 다음과 같은 방법이 필요하다.

- 자료형 (*포인터이름)[가로크기];

즉, 포인터를 선언할 때 *과 포인터 이름을 괄호로 묶어준 뒤 [ ]에 가로 크기를 지정한다.

 

※ int *numPtr[4]

int (*numPtr)[4]에서 괄호를 뺀 int *numPtr[4] int형 포인터 4개를 담을 수 있는 배열이라는 뜻이다.

즉, 괄호가 있으면 배열을 가리키는 배열 포인터, 괄호가 없으면 포인터를 여러 개 담는 포인터 배열이다.

int num1, num2, num3, num4;
int *numPtr[4] = { &num1, &num2, &num3, &num4 };    // int형 포인터를 4개 담는 배열

 

#include <stdio.h>

int main()
{
    int numArr[3][4] = {    // 세로 3, 가로 4 크기의 int형 2차원 배열 선언
        { 11, 22, 33, 44 },
        { 55, 66, 77, 88 },
        { 99, 110, 121, 132 }
    };

    int (*numPtr)[4] = numArr;

    printf("%p\n", *numPtr); // 002BFE5C: 2차원 배열 포인터를 역참조하면 세로 첫 번째의 주소가 나옴
                             // 컴퓨터마다, 실행할 때마다 달라짐

    printf("%p\n", *numArr); // 002BFE5C: 2차원 배열을 역참조하면 세로 첫 번째의 주소가 나옴
                             // 컴퓨터마다, 실행할 때마다 달라짐

    printf("%d\n", numPtr[2][1]);    // 110: 2차원 배열 포인터는 인덱스로 접근할 수 있음

    printf("%d\n", sizeof(numArr));  // 48: sizeof로 2차원 배열의 크기를 구하면 배열이 메모리에 
                                     // 차지하는 공간이 출력됨

    printf("%d\n", sizeof(numPtr));  // 4 : sizeof로 2차원 배열 포인터의 크기를 
                                     // 구하면 포인터의 크기가 출력됨(64비트라면 8)

    return 0;
}

int (*numPtr)[4] = numArr;와 같이 2차원 배열을 포인터에 바로 할당할 수 있다. 단, 자료형과 가로 크기가 일치해야 한다.

2차원 배열을 포인터에 할당한 뒤 포인터를 역참조해보면 배열의 세로 첫 번째 주솟값이 나온다. 마찬가지로 2차원 배열 자체도 역참조해보면 배열의 세로 첫 번째 주솟값이 나온다.

 

+ 2차원 배열 포인터는 [ ]를 두 번 사용하여 배열의 요소에 접근할 수 있다.

 

복사했습니다!