2차원 배열

int arr[3][3];

다음과 같은 3행 3열의 2차원 배열이 있다 가정해보자. 이때 각각의 칸들은 칸 안에 쓰여있는 이름이다.

0행0열 0행1열 0행2열
1행0열 1행1열 1행2열
2행0열 2행1열 2행2열

arr[0]은 0행0열 즉 1번째 줄의 1번째, arr[1]은 1행 즉 2번째 줄의 1번째, arr[2]은 2행 즉 3번째 줄의 1번째를 의미한다.
이를 예제로 살펴보며 arr과 arr[0]은 같은 것일까 생각해보자.(출력 결과 자체는 둘다 0행 0열을 가리킨다.)

<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main(void) {
    int arr[3][3];
    printf("%d \n", arr);
    printf("%d \n", arr[0]);
    printf("%d \n\n"&arr[0][0]);
 
    printf("sizeof(arr) : %d\n"sizeof(arr));
    printf("sizeof(arr) : %d\n"sizeof(arr[0]));
    return 0;
}
cs

<실행결과>

5 6 7 번 라인에서 알 수 있듯이 모두 같은 주소 값을(배열의 0행 0열) 가진다. 그러나 arr은 첫 번째 요소를 가리키며 배열 전체를 가리키지만 arr[0]은 첫번째 요소를 가리키며 배열의 첫 줄 즉 0행만을 의미한다. (3행 3열 즉 9칸이고 int 이므로 4byte. 36byte는 배열의 전체이고 12byte는 배열의 한 줄을 의미한다.)


이번에는 배열 이름에 1을 더한 결과를 알아보자. 앞서서 1차원 배열의 이름에 1을 더한 결과를 알아보았기 때문에 이해할 수 있으리라 생각한다. 예시와 함께 알아보자.

<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main(void) {
    int arr1[3][2];
    int arr2[3][3];
 
    printf("arr1: %p \n", arr1);
    printf("arr1+1: %p \n", arr1 + 1);
    printf("arr1+2: %p \n", arr1 + 2);
 
    printf("arr2: %p \n", arr2);
    printf("arr2+1: %p \n", arr2 + 1);
 
    return 0;
}
cs

<실행결과>

arr1, arr1+1, arr1+2를 보면 16진수라서 잘 와닿지는 않지만 12씩 차이 나는 것을 볼 수 있고

arr2, arr2+1을 보면 8씩 차이나는것을 볼 수 있다. 이를 그림으로 표현하면 다음과 같다.

즉 한 줄씩 차이 난다는 것을 확인할 수 있는 것이다. 따라서 arr1, arr2는 둘 다 int형 2차원 배열이지만 열의 정보가 다르므로 다른 것을 확인할 수 있다.


2차원 배열의 포인터 형

char (*arr1)[4]; // arr1은 char형 변수를 가리키면서, 포인터 연산 시 1(char의 크기) x 4의 크기 단위로 증가 감소

double (*arr2)[7]; // arr2은 double 변수를 가리키면서, 포인터 연산 시 8(double의 크기) x 8의 크기단위로 증가 감소

 

그렇다면 2차원 배열을 함수의 인자로 전달을 해보자. 예시와 함께 알아보자.

<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
 
void ShowArr(int array[][2], int column) {
    for (int i = 0; i < column; i++) {
        for (int j = 0; j < 2; j++) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
}
 
void ShowArr2(int (*array)[4], int column) {
    for (int i = 0; i < column; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
}
 
int main(void) {
    int arr1[3][2= {
        {12},
        {34},
        {56}
    };
 
    int arr2[2][4= {
        {5678},
        {9101112}
    };
 
    ShowArr(arr1, sizeof(arr1) / sizeof(arr1[0]));
    puts("");
 
    ShowArr2(arr2, sizeof(arr2) / sizeof(arr2[0]));
    return 0;
}
cs

<실행결과>

3번 라인과 12번 라인에서 볼 수 있듯이 두 가지 방법으로 2차원 배열의 매개변수 선언을 알 수 있다. 이 둘 중 3번 라인의 방식 int array [][3] 이 배열을 매개변수로 전달하는 것을 알기 쉬우므로 이 방법을 권장한다. 또한 두 번째 매개변수로 int column 즉 행의 정보를 넘겨주는 것을 알 수 있는데 이는 2차원 배열의 매개변수가 열 정보만 포함하고 있고 행 정보는 포함하고 있지 않기 때문이다. 따라서 열 정보가 같으면 행의 정보는 달라도 매개변수로 넘겨줄 수 있기 때문에 이를 보완하기 위해서 행 정보를 넘겨주는 것이다.

'C' 카테고리의 다른 글

10. 문자열 관련 함수  (0) 2021.06.27
9. 함수 포인터 & void 포인터  (0) 2021.06.26
7. 이중 포인터  (0) 2021.06.25
6. 다차원 배열  (0) 2021.06.25
5. 포인터와 함수  (0) 2021.06.25

+ Recent posts