#include <stdio.h>
int main(void)
{
const int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
const int (*pa)[4] = arr;
for(int i = 0; i < 3; ++i)
{
for(int j = 0; j < 4; ++j)
{
printf("%5d ", pa[i][j]);
}
printf("\n");
}
return 0;
}
코드에서 const int (*pa)[4]를 arr 주소로 값을 초기화한 다음 출력을 하면 정상적으로 출력되는 것을 확인할 수 있는데요,
메모리 창의 정보는 다음과 같습니다.
0x00D5FAB8 cccccccc ????
0x00D5FABC cccccccc ????
0x00D5FAC0 cccccccc ????
0x00D5FAC4 00d5fad0 ???.
0x00D5FAC8 cccccccc ????
0x00D5FACC cccccccc ????
0x00D5FAD0 00000001 ....
0x00D5FAD4 00000002 ....
0x00D5FAD8 00000003 ....
0x00D5FADC 00000004 ....
0x00D5FAE0 00000005 ....
0x00D5FAE4 00000006 ....
0x00D5FAE8 00000007 ....
0x00D5FAEC 00000008 ....
0x00D5FAF0 00000009 ....
0x00D5FAF4 0000000a ....
0x00D5FAF8 0000000b ....
0x00D5FAFC 0000000c ....
메모리를 뒤져봐도 pa는 0x00D5FAC4라는 arr의 주소 값을 갖고 있지 4라는 값(열 정보)에 대한 정보는 찾아볼 수가 없는데 어떻게 pa[i][j] 이런 식으로 접근이 가능한건가요?
뭔가 메모리를 까보니 더 아리송해진 상황입니다.
원래 배열을 사용할 때 int arr[3]; 을 만들었다 하더라도
메모리엔 3이라는 열에 대한 정보가 들어가진 않습니다.
컴파일 타임에 C++에서 그렇게 메모리 크기를 잡아주는 코드를 만들 뿐이죠.
위와 같이 보시면 조금 더 이해하기가 편할겁니다.
pa 는 단순히 주소값을 가리키는 포인터에 불과하고,
[4개의 정수가 모인 배열] 타입을 가리키고 있습니다.
pa[0], pa[1] 등으로 ArrayType을 큼지막하게 넘어갈 수 있고
ArrayType 내부의 각 데이터를 다시 [j]로 접근할 수 있겠죠.
사실 i < 3, j < 4와 같은 정보가 아니라 i < 10, j < 10와 같은 코드를 넣어도
컴파일엔 아무 문제가 없습니다 (다만 런타임에 크래시 날 확률이 '꽤' 높겠죠)
답글
pubtec59
2023.04.28답변 감사합니다! 그렇다면 <타입>에 [4]라는 정보가 들어간다고 이해하면 될까요?
Rookiss
2023.04.28네 그렇게 볼 수 있습니다. 어쨌든 C++ 관점에선 배열의 크기가 다르면 아예 다른 타입이기 때문이죠.