ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2차원 배열
    C언어/C언어 2020. 7. 13. 03:37

    1. 2차원 배열이란?

    가장 기본적인 배열은 1차원 배열이다.

     

    1차원 배열은 아래와 같이 입력한 값을 단순히 나열하는 것에 그친다.

     

    #include <stdio.h>
    
    int main(void){
      int scores[5] = {60, 70, 80, 70, 75};
    }

     

    하지만 2차원 배열은 다르다.

     

    1차원이 단순히 입력한 값을 나열한 것에 불과한데 반해 2차원은 행과 열을 가지고 있다.

     

    행과 열 두가지 값을 동시에 가지고 있으며 그 형태는 사각형과 비슷하다.

     

    즉 사각형으로 치면 행은 세로 길이, 열은 가로 길이라고 생각해도 된다.

     

    출력시엔 행과 열을 모두 입력해줘야 한다.

     

    그리고 각 입력값의 주소는 인덱스값이라서 [0][0]에서 시작한다.

     

    #include <stdio.h>
    
    int main(void){
      int scores[3][5] = {
      // 가로줄 3개 세로줄 5개의 배열을 만들어준다는 선언. 즉 3행 5열로 만드는 배열.
      // 2차원 배열을 할 경우에는 중괄호 { }를 두번씩 쳐준다.
      {99, 90, 95, 93, 91},
      {85, 89, 81, 83, 87},
      {72, 74, 76, 77, 78}
    };
    
    printf("%d", scores[1][3]); // 83 출력. 인쇄시 배열의 행과 열의 값을 모두 입력해야 한다.
    }

     

    위 표현식을 표로 나타내면 다음과 같다.

     

    99 (위치 : [0][0] )

    90 (위치 : [0][1] )

    95 (위치 : [0][2] )

    93 (위치 : [0][3] )

    91 (위치 : [0][4] )

    85 (위치 : [1][0] )

    89 (위치 : [1][1] )

    81 (위치 : [1][2] )

    83 (위치 : [1][3] )

    87 (위치 : [1][4] )

    72 (위치 : [2][0] )

    74 (위치 : [2][1] )

    76 (위치 : [2][2] )

    77 (위치 : [2][3] )

    78 (위치 : [2][4] )

    2. 2차원 배열 초기화 하기

    처음 배열을 선언할 때 중괄호 안에 0과 , 를 넣는다. { 0,  } 식으로 하면 된다.

     

    #include <stdio.h>
    
    int main(void){
      int scores[3][5] = {0, };
    
    printf("%d\n", scores[0][3]); // 0 출력.
    printf("%d\n", scores[1][3]); // 0 출력.
    printf("%d\n", scores[2][2]); // 0 출력.
    }

     

    3. 2차원 배열에 값 할당 하기

    1번과 달리 각 요소별로 값을 따로 할당할 수 있다.

     

    하지만 이렇게 할 경우 타이핑할 것이 너무 많아진다.

     

    값을 수정하거나 할 때 사용하는 것이 좋다.

     

    #include <stdio.h>
    
    int main(void){
      int scores[3][5];
      
      scores[0][0] = 99; //0번 행의 0번 열의 요소에 값 할당
      scores[0][1] = 90;
      scores[0][2] = 95;
      scores[0][3] = 93;
      scores[0][4] = 91;
      
      scores[1][0] = 85; //1번 행의 0번 열의 요소에 값 할당
      scores[1][1] = 89;
      scores[1][2] = 81;
      scores[1][3] = 83;
      scores[1][4] = 87;
     
      scores[2][0] = 72;
      scores[2][1] = 74;
      scores[2][2] = 76;
      scores[2][3] = 77;
      scores[2][4] = 78; //2번 행의 4번 열의 요소에 값 할당
    }

     

    4. 2차원 배열의 크기 구하기

    여기서 말하는 크기는 각 배열이 가진 저장 공간의 값을 말한다

     

    C언어에서 정수형 자료 1개의 크기는 4바이트다.

     

    그래서 아래와 같이 배열의 사이즈를 구하면 저장공간 * 배열 요소의 갯수를 결과값으로 얻을 수 있다.

     

    #include <stdio.h>
    
    int main(void){
      int scores[3][5] = {
      {99, 90, 95, 93, 91},
      {85, 89, 81, 83, 87},
      {72, 74, 76, 77, 78}
    };
    
    int all = sizeof(scores);
    // 60출력: 전체 배열의 크기 (4*15)
    
    int one = sizeof(scores) / sizeof(int);
    // 15출력: 전체 배열 / 자료형의 크기 (60/4)
    
    int col = sizeof(scores[0]) / sizeof(int);
    // 세로 줄의 갯수. 가로 한줄의 크기를 요소의 크기로 나눠줌. (20/4)
    
    int row = sizeof(scores) / sizeof(scores[0]);
    // 가로 줄의 갯수. 배열의 전체 공간을 가로 한줄의 크기로 나눠줌. (60/20)
    
    printf("%d\n", all); // 60출력
    printf("%d\n", one); // 15출력
    printf("%d\n", col); // 5출력
    printf("%d\n", row); // 3출력
    }

     

    5. 2차원 배열의 모든 숫자 출력하기

    for문을 이용해서 가로행, 세로열의 숫자들을 대입하는 식으로 인쇄한다.

     

    #include <stdio.h>
    
    int main(void){
      int scores[3][5] = {
      {99, 90, 95, 93, 91},
      {85, 89, 81, 83, 87},
      {72, 74, 76, 77, 78}
    };
    
    int col = sizeof(scores[0]) / sizeof(int);
    // 세로줄의 갯수 구하는 식. 가로 한줄의 크기를 요소의 크기로 나눠줌. (20/4)
    
    int row = sizeof(scores) / sizeof(scores[0]);
    // 가로줄의 갯수 구하는 식. 배열의 전체 공간을 가로 한줄의 크기로 나눠줌. (60/20)
    
    for (int i = 0; i < row; i++){ // 가로열의 숫자만큼 반복하여 수행하도록
      for (int j = 0; j < col; j++){ // 세로행의 숫자만큼 반복하다여 수행하도록
        printf("%3d", scores[i][j]); //score[i][j]가 반복되면서 인쇄되도록
      }
      
      printf("\n"); //가로행 인쇄 끝나고 다음 줄로 넘김
    }
    
    }

     

    6. 2차원 배열의 포인터 할당

    2차원 배열을 포인터에 할당할 경우 "자료형 + (*포인터명)[가로줄의 길이]"로 선언하면 된다.

     

    #include <stdio.h>
    
    int main(void){
      int scores[3][5] = {
      {99, 90, 95, 93, 91},
      {85, 89, 81, 83, 87},
      {72, 74, 76, 77, 78}
    };
    
    int (*point)[5] = scores;
    //2차원 배열선 가로의 크기 즉 열만큼의 크기를 입력하고 포인터를 선언해야 함
    
    printf("%p\n", point); // 0x7ffca50ff470출력. 포인터의 주소값
    
    printf("%p\n", *point); // 0x7ffca50ff470출력. 포인터의 주소값
    
    printf("%p\n", *scores); // 0x7ffca50ff470출력. 스코어배열의 주소값
    
    printf("%p\n", &scores); // 0x7ffca50ff470출력. 스코어배열의 주소값
    
    printf("%p\n", &point[0][0]); // 0x7ffca50ff470출력. 포인트의 [0][0]위치 주소값
    
    printf("%p\n", &scores[0][0]); // 0x7ffca50ff470출력. 스코어의 [0][0]위치 주소값
    
    // 위 주소값을 보면 2차원 배열에 포인터값을 지정해줄 경우
    
    // 기본 주소 값은 2차원 배열의 [0][0] 위치의 주소값이 자동 배정됨을 알 수 있다.
    
    
    printf("%d\n", point[0][0]); //99
    
    printf("%d\n", point[1][1]); //89
    
    printf("%d\n", point[2][2]); //76
    
    printf("%d\n", scores[0][0]); //99
    
    printf("%d\n", scores[1][1]); //89
    
    printf("%d\n", scores[2][2]); //76
    
    // 2차원 배열에 포인터 지정시 가로줄의 길이만큼 배정했지만
    // 2차원 배열 자체는 통째로 포인터로 할당된 것을 알 수 있다.
    }
Designed by Tistory.