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