본문 바로가기
C.C++/전반

다차원 배열

by 겜게준 2017. 6. 20.

어저께 이차원 배열에 대해서 다른 사람에게 설명을 못하겠다고 하여서 대신 설명하게 되었다. 그 친구가 설명한 방식은 다음과 같았다.


"이차원 배열이란 말 그대로 이차원적인 배열이고 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

댓글