ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C언어] 다차원 배열 그리고 포인터 배열
    CS & Algorithm & Data Structure & C 2021. 11. 5. 16:33
    반응형

    2차원 배열은 Javascript를 할 때도 헷갈릴 수 있는 부분이다.

    그러나 또 굉장히 많이 사용 되므로 잘 알아두어야 한다.

    행렬 데이터를 표현 할 때, 그래프 알고리즘을 처리할 때 등 다양한데 우리가 흔히 볼 수 있는 것으로는 표 구조가 2차원 배열과 흡사하여 2차원 배열로 모델링 하기 쉽다고 할 수 있다.

     

    2차원 배열이란?

    2차원 배열은 바로 1차원 배열이 중첩되었다는 의미이다. 그래서 대괄호([])를 두번 연속해서 사용하여 표현하게 된다.

    이를 표현하자면 아래와 같다.

    자료형 배열이름[행][열] = {{값, 값}, {값, 값}}
    int a[10][10] // 10 x 10

    2차원 배열 또한 일반적인 배열처럼 index 번호 0부터 시작하며 주로 2중 for문으로 많이 사용되어진다.

    A[0][0] A[0][1] A[0][2]
    A[1][0] A[1][1] A[1][2]
    A[2][0] A[2][1] A[2][2]
    A[3][0] A[3][1] A[3][2]
    A[4][0] A[4][1] A[4][2]
    int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    
    int main(void) {
        
        for(int i = 0; i < 3; i++) {
            for(int j = 0; j < 3; j++) {
                printf("%d", a[i][j]);
            }
            printf("\n");
        }
        return 0;
    }
    
    //OUTPUT?
    //123
    //456
    //789

    위의 경우 각 배열을 행이라고 보면 되는데, 첫 번째 행에 1, 2, 3, 두번째 행에 4, 5, 6, 세번째 행에 7, 8, 9가 들어간다고 보면 된다.

    중첩된 배열의 경우 이중 for문을 이용해서 나타낼 수 있으며 각 행마다 끊어줌으로써 3x3으로 나타낼 수 있을 것이다.

     

    다차원 배열?

    2차원 배열 이상의 경우를 말한다.

    컴퓨터는 기본적으로 화면에 2차원 형태만 출력이 가능하며, 내부적으로 다차원 구조로 동작한다고 이해할 수 있을 것이다.

    그렇다면 3차원 배열을 나타내보자. 

    #include <iostream>
    #include <stdio.h>
    
    int a[2][3][3] = {{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}, {{1, 2, 3},{4, 5, 6}, {7, 8, 9}}};
    
    int main(void) {
        
        for(int i = 0; i < 2; i++) {
            for(int j = 0; j < 3; j++) {
                for(int k = 0; k < 3; k++) {
                    printf("%d", a[i][j][k]);    
                }
                printf("\n");
            }
            printf("\n");
        }
        return 0;
    }
    
    // OUTPUT?
    //123
    //456
    //789
    
    //123
    //456
    //789

    이 또한 for문을 이용해서 나타낼 수 있을 것이다.

     

    포인터 배열?

    배열은 포인터와 같은 방식으로 동작한다.

    즉, 배열의 이름은 배열 원소의 첫 번째 주소가 된다.

    이 둘은 내부적으로 거의 동일하게 동작하지만, 차이라고 한다면 포인터는 변수(Variable)이며 배열의 이름은 상수(Constant)이다.

    한 예를 보자.

    #include <iostream>
    #include <stdio.h>
    
    int main(void) {
    
        int a = 10;
        int b[10];
        
        b = &a;
    
        return 0;
    }

    이렇게 출력하면 어떻게 될까?

    오류메세지로 "int b[10]가 수정 할 수 있는 value여야한다"고 나온다.

    이는 상수를 변경하고자 할 때 볼 수 있는 오류 메세지이다.

     

    반대로 포인터를 배열처럼 사용 할 수는 있다.

    만약 배열을 주소값을 바꾸어서 사용하고자 한다면 포인터를 사용해야 할 것이다.

    #include <iostream>
    #include <stdio.h>
    
    int main(void) {
    
        int a[5] = {1, 2, 3, 4, 5};
        int *b = a;
        
        printf("%d\n", b[2]); // 3
    
        return 0;
    }

    이렇게 하면 b의 포인터 변수의 값을 성공적으로 바꿀 수 있을 것이다.

    또한 포인터는 연산이 가능하기 때문에 주로 사용이 되어진다.

    반응형
Designed by Tistory.