[C] 배열

1 minute read

데이터 타입을 설명할 때, Data type에서는 변수 한개에 대해 자료형을 선언하고 값을 대입했다. 하지만 100개의 값에 대해서 100개의 변수를 선언하는 것은 매우 비효율적이다. 이렇게 여러 값을 다루고자 할 때 배열을 사용한다. 배열은 같은 자료형을 묶어서 하나로 관리하는 집합으로 이해 할 수 있다. 배열을 사용하기 위해서는 자료형에 대한 선언과 요소 수에 대한 선언이 필요하다. 이때 요소 수에 대한 선언은 대괄호를 사용하고, 초기 값에 대한 선언은 중괄호를 사용한다.

int x[element number]={initial value, };

배열을 우선 선언하고 나면 각 요소에 접근할 수 있는데 요소 수에 대한 선언과 동일하게 대괄호를 사용하여 접근하지만 요소참조범위는 0에서부터 시작하며 요소수-1까지이다.

    #include <stdio.h>
    
    int x[5];
    char y[5];

    int main(void){
        
        int a[3]={1,2,3};
        int b[4]={10,};
        int c[10]={0,};


        char ca[3]={'a','b','c'};
        char cb[3]="AB";
        char cc[3]={'\0',};


        int dir[]={1,0,-1,0};


        return 0;
    }
          

배열을 선언할 때, 지역변수로 선언하는 경우 초기화를 반드시 수행해주어야하며, 전역변수로 선언하는 경우 모든 요소가 0 이나 '\0'으로 자동 초기화 된다. 초기 값을 할당할 때에 배열의 크기보다 작은 값을 선언하면 나머지 값은 0 혹은 '\0'으로 자동으로 할당된다. 특히 지역변수에서 0으로 선언하는 구문은 자주 사용된다. 반대로 모든 초기화 값을 할당하는 경우 배열의 요소수를 생략할 수 있다. 하지만 배열의 크기보다 많은 요소를 사용하여 초기화를 할 수는 없는데, 문자열의 경우 항상 맨 마지막에 null 문자인 '\0' 문자가 포함되어 있기 때문에 배열의 크기를 계산할 때 유의해야한다.

    #include <stdio.h>

    int main(void){
        
        int a[10]={0,};

        for(int i=0; i<10; i++){
            scanf("%d", &a[i]);
        }


        char b[10]={'\0',};

        scanf("%s", b);


        for(int i=0; i<10; i++){
            printf("%d", a[i]);
        }

        printf("\n%s", b);

        return 0;
    }         

1 2 3 4 5 6 7 8 9 10
test
12345678910
test
  • 다차원 배열

대괄호를 연속적으로 사용하여 다차원 배열을 선언할 수 있으며 속성은 일차원 배열과 동일하다. 다차원이라는 용어를 사용하긴 했지만 배열이 메모리에 저장되는 순서나 방식은 순차적으로 수행되며, 각 배열의 요소에 접근 및 이해를 위해 이 글에서는 2차원 배열의 경우 x[row][column]와 같이 이해한다.

배열의 차원이 커지고 크기가 커지면 배열의 요소 수를 매번 확인하기 힘들기 때문에 sizeof 함수를 이용한 형태를 많이 사용한다. 첫 번째 차원의 요소 수는 sizeof(a)/sizeof(a[0])이며, 두 번째 차원의 요소 수는 sizeof(a[0])/sizeof(a[0][0])와 같이 계산한다.

    #include <stdio.h>
    int main(void){
        
        int a[3][3]={ {1,2,3}, {1,2,3}, {1,2,3} };

        for(int i=0; i<3;i++){
            for(int j=0; j<3; j++){
                printf("%d", a[i][j]);
            }
        }

        for(int i=0; i < sizeof(a) / sizeof(a[0]) ; i++){
            for(int j=0; j < sizeof(a[0]) / sizeof(a[0][0]) ; j++){
                printf("%d", a[i][j]);
            }
        }

        return 0;
    }        
123123123
123123123