C/C++ - 2차원 배열과 포인터의 관계
Programming 2006/12/26 03:45int arr[5][2];위 코드는 int형 메모리 공간을 2차원 형태 2 × 5 로 만들어 주는 정적 배열 선언이다.
그리고 위 코드를 실행하게 되면, 아래의 그림과 같이 메인 메모리에 40byte의 메모리를 할당 받게 된다.
그 그림은 인간이 이해하기 쉽게 가상으로 구성한 2차원 공간의 메모리 구조이다.

실제적으로 메모리는 선형구조로 구성되어지기 때문에, 2차원적인 access를 위해서 다음과 같은 구조를 구성해야 한다. (즉, 1차원 배열들을 선형적으로 bind 시켜 놓은 것이라 생각 할 수 있다.)
※ 정적 2차원 배열인 경우, 컴파일러가 자동으로 다음과 같은 구조를 만들어 준다.
그러나 동적 2차원 배열을 만들기 위해서는 개발자가 manual로 다음과 같은 구조를 만들어야 한다.

위 그림에서 알 수 있듯이, 2차원 배열은 두 번 참조를 한다는 사실을 알 수 있을것이다.
이것은 일차원 배열과 같은 방법으로 접근 할 수 있다. 즉, 배열의 시작 주소 + 오프셋(OffSet)을 통해서 접근 할 수 있다.
예제로써 arr[2][1]이 어떻게 참조 되는 지 한번 알아보자.
첫 번째 참조는 arr[2] 이다. 이것은 3번째 일차원 배열의 시작 주소를 참조한다.
두 번째 참조는 배열의 시작 주소 (0x0024) 로부터 OffSet(1) 만큼 떨어진 주소에서 4byte 크기만큼 메모리의 내용을 읽어 온다. 그리고 OffSet 계산법은 일차원 배열의 OffSet 계산법과 동일하다. (즉,
(sizeof(int) * 1);)※ 요약 : arr[i] [j]
i + 1 번째 일차원 배열의 시작 주소 ─―──┘ └─ OffSet(j) 연산


