다차원 배열

1 minute read


다차원 배열

2차원 이상의 배열을 의미하며, 배열의 요소로 또 다른 배열을 가지는 배열을 의미한다.

2차원 배열은 1차원 배열을 요소로 가지며 3차원 배열은 2차원을 배열로 가지는 형태이다.


1. 2차원 배열

  • 자료형 변수명 [열의 길이][행의 길이] { 초기화 리스트 } 의 형식으로 선언한다.

    #include <stdio.h>
    
    int main()
    {
        int iArr2D[2][3] = {
            { 1, 2, 3},
            { 4, 5, 6}
        };
            
        return 0;
    }
    

    코드를 분석해보면 처음 대괄호 안에는 1차원 배열의 개수를 선언하였고, 두 번째 대괄호에서는 그 1차원 배열의 크기를 선언하는 것이다. 따라서 가장 바깥 중괄호는 2차원 배열안에 담을 요소를 묶은 것이고 그 안에 2개의 중괄호 묶음이 각 1차원 배열들인 것이다.

  • 배열의 활용하기 위해서는 인덱스의 위치를 알고있어야한다.
    2차원 배열의 인덱스 순서는 행렬의 모습과 비교하면 이해하기 쉽다.

      iArr2D[][]
    
      { [0][0] [0][1] [0][2]},
      { [1][0] [1][1] [1][2]}
    

    array_2_decimal_

    가로 방향으로 열이 증가하고 세로 방향으로 행이 증가한다.


2. 인덱스로 배열 접근

  • 1차원 배열은 출력할 때 반복문을 사용하였다. 2차원 배열도 마찬가지이며 배열이 두 개이기 때문에 반복문도 중첩해서 사용해주면 된다.

    for (int i = 0; i < 2; i++)
    {
      for (int j = 0; j < 3; j++)
      {
        printf("%d, ", iArr2D[i][j]);
      }
      printf("\n");
    }
    
    // 출력결과 
    // 1 2 3
    // 4 5 6
    


3. 메모리 구조

  • 2차원 배열의 실제 메모리 구조는 행렬처럼 입체적 구조가 아니라 일자로 나열된 공간에 순서대로 나열된다.

    array_2_decimal_memory

    그림에서 처럼 우선 두 번째 대괄호 즉 행의 크기만큼 나열하고 열의 크기 만큼 더 할당하는 형태이다.

    주소를 출력해서 확인해 보면

       int iArr2D[2][3] = {
        { 1, 2, 3},
        { 4, 5, 6}
    };
    
    
    for (int i = 0; i < 2; i++)
    {  
        for (int j = 0; j < 3; j++)
        {
            printf("iArr2D[%d][%d]: %d (%p)\n", i, j, iArr2D[i][j], &iArr2D[i][j]);
        }
    }
    


    결과

    array_2_decimal_momory_address

    메모리주소의 값이 일정한 간격을 두고 있는걸 알 수 있다.


  • 1차원 배열에서는 초기화 리스트를 써주면 크기를 직접 할당하지 않아도 요소의 수만큼 크기가 할당되었다.

    2차원 배열의 경우에는 열의 크기는 생략할 수 있지만 행의 크기는 반드시 명시해 주어야한다.

        int iArr2D[][3] = {
        { 1, 2, 3},
        { 4, 5, 6}
    };
    

    열의 경우 초기화 리스트에 중괄호로 구분한 수 만큼 할당하면 되지만, 행의 경우 빈 공간은 0으로 채우기 때문에 기준이 되는 크기를 알아야 하기 때문이다.

        int iArr2D[][3] = {
        { 1, 2},
        { 4, 5, 6}
        {}
    };
    

    위 코드는 정상적으로 동작한다. 첫 번째 열의 빈 공간은 0으로 채워지고 마지막 열의 요소는 모두 0으로 채워진다.

Tags: , ,

Categories:

Updated: