어저께 이차원 배열에 대해서 다른 사람에게 설명을 못하겠다고 하여서 대신 설명하게 되었다. 그 친구가 설명한 방식은 다음과 같았다.
"이차원 배열이란 말 그대로 이차원적인 배열이고 int a[3][5]는 3x5랑 같다. 그러니까 이러한 모양이다."
□□□□□
□□□□□□□□□□
사실 이런식으로 설명하면 int a[3][3][5]는
□□□□□
■■■■■□
□□□□□■□
□□□□□■
□□□□□
이런식으로 설명이 가능할 것이다. 하지만 메모리에는 다음과 같이 올라가지 않는다.
1)
int a[3][5]{ {1, 2, 3, 4, 5} , {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15} }; int *p = (int *)a; for (int i = 0; i < 15; i++)
{ std::cout << p[i] << std::endl; }
2)
int a[3][5]{ {1, 2, 3, 4, 5} , {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15} }; int *p = (int *)a; for (int i = 0; i < 15; i++)
{ std::cout << &p[i] << std::endl; }
사실 이차원 배열이랄 것도 없고 그냥 배열의 배열이다. 그렇기 때문에 실제적인 구조는 주소값 출력을 보면 알겠지만 사실 a의 구조는 이런식이다.
a[0] a[1] a[2]
□□□□□|□□□□□|□□□□□
a[0][0] a[1][0] a[2][0]
어떻게 생겨먹은건가 생각할 수 있다.
일단 배열 첨자 연산자( [] )는 결과로 *( (v1) + (v2))값을 리턴하게 된다. 그렇기 때문에 이런식의 출력도 가능하다.
std::cout << i[p] << std::endl;
그렇기 때문에 결과적으로 a[0], a[1], a[2]는 해당 배열의 시작 주소를 담으며 a[0][0], a[r1][r2] ..... 값들은 r1 만큼의 오프셋에 있는 배열의 시작주소에서 r2 만큼의 오프셋에 있는 데이터 주소에 역참조 ( * )한 값을 리턴하게 된다.
흔히들 말하는 3차원 배열도 마찬가지 이다.
'C.C++ > 전반' 카테고리의 다른 글
RAII (0) | 2018.05.23 |
---|---|
파라미터에서 Pointer, Reference (0) | 2017.06.22 |
네이밍 (2) | 2017.05.06 |
댓글