37.1 2차원 배열

2차원 배열

2차원 배열은 가로⨉세로 형태로 이루어져 있으며, 행과 열 모두 0부터 시작한다.

2차원 배열 선언

  • 대괄호 [ ]를 두 번 사용하여 선언한다.
  • 첫 번째 대괄호에는 세로 크기, 두 번째 대괄호에는 가로 크기를 지정한다.
  • 배열로 만들 때는 세로 ⨉ 가로로 표기한다.
  • 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;
}

배열의 초기화

2차원 배열을 초기화 할 때, 가로 요소를 중괄호로 묶지 않아도 컴파일이 잘 된다. 물론 결과도 가로 요소를 중활호로 묶었을 때와 같다. 하지만 이렇게 작성하면 이해하기가 어려워서 잘 쓰이지 않는다.

int numArr[3][4] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110, 121, 132 };

2차원 배열 초기화

모두 0으로 초기화

#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으로 초기화 할 수 있다.
  • 0을 일일이 나열하지 않아도 된다.

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차원 배열에서 범위를 벗어난 인덱스에 접근하면 컴파일 에러는 발생하지 않지만, 배열이 아닌 다른 메모리 공간에 접근하게 되어 쓰레기값이 출력된다.

  • 또한, 2차원 배열은 값이 일렬로 쭉 늘어서 있으므로 numArr[0][4]와 같이 가로 인덱스가 범위를 벗어나도록 지정하면 그 다음 세로 인덱스 요소인 numArr[1][0]에 접근하게 된다.

 printf("%d\n", numArr[-1][-1]);   // 음수이므로 잘못된 인덱스
    printf("%d\n", numArr[0][4]);     // 가로 인덱스가 배열의 범위를 벗어남
    printf("%d\n", numArr[4][0]);     // 세로 인덱스가 배열의 범위를 벗어남
    printf("%d\n", numArr[5][5]);     // 세로, 가로 인덱스 모두 배열의 범위를 벗어남


/*
실행 결과
-858993460 (쓰레기 값)
55         (원하지 않는 요소 [1][0]에 접근)
4687800    (쓰레기 값)
2359296    (쓰레기 값)
*/



출처

https://dojang.io/mod/page/view.php?id=306
https://dojang.io/mod/page/view.php?id=307
https://dojang.io/mod/page/view.php?id=308
https://dojang.io/mod/page/view.php?id=309

좋은 웹페이지 즐겨찾기