2차원 배열과 포인터

2차원 배열을 포인터로 가리키기

1
2
3
4
5
6
7
8
9
int a[2][3] = { {100, 200, 300}, {400, 500, 600} };
int *pt;

pt = &a[0][0]; // -- 가능
pt = a[0];     // ------ 가능
pt = (int *)a; // --- 가능
pt = a; // --------- 경고 : a 자체의 타입은 3개의 int 배열을 가리키는 포인터

int(*pt2)[3] = a; // 이렇게 해야 함

포인터 연산을 이용한 2차원 배열 접근

1
2
3
4
int a[2][3] = { {100, 200, 300}, {400, 500, 600} };
int *pt = a[0];
printf("*(pt+1) : %d\n", *(pt + 1));
printf("pt[1]   : %d\n", pt[1]);
1
2
3
# 출력
*(pt+1) : 200
pt[1]   : 200
1
2
3
4
5
6
7
8
| address |   variable  |   pointer   | value |
| ------- | ----------- | ----------- | ----- |
| 0x00100 | a, a[0][0]  |  p   , a    | 100   |
| 0x00104 | a[0][1]     |  p+1 , a+1  | 200   |
| 0x00108 | a[0][2]     |  p+2 , a+2  | 300   |
| 0x0010c | a[1][0]     |  p+3 , a+3  | 400   |
| 0x00110 | a[1][1]     |  p+4 , a+4  | 500   |
| 0x00114 | a[1][2]     |  p+5 , a+5  | 600   |

2차원 배열의 각 요소는 연속된 메모리에 존재한다.

1
2
3
4
5
int a[2][3] = { {100, 200, 300}, {400, 500, 600} };
int *pt = a[0];
for (int i = 0; i < 6; i++){
    printf("%d ", pt[i]);
}
  • 또는
1
2
3
4
5
6
7
int a[2][3] = { {100, 200, 300}, {400, 500, 600} };
int *pt = a[0];
for (int i = 0; i < 2; i++){
    for (int j = 0; j <3; j++){
        printf("%d ", *(pt + i*3 + j));
    }
}
  • 출력
1
2
# 출력
100 200 300 400 500 600

Reference

C 프로그래밍 (김형근, 곽덕훈, 정재화 공저)
C 프로그래밍 강의 (방송통신대 - 이병래)

Comments