C/C++ - 2차원 배열과 포인터의 관계

Programming 2006/12/26 03:45
int 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) 연산
Creative Commons License
Creative Commons License
명언 한마디
재능은 칭찬에 의해 어지럽혀진다.
쥬벨
top

C/C++ - Double 포인터

Programming 2006/12/23 17:30
int   val = 100;
int  *pt1 = &val; // Single 포인터
int **pt2 = &pt1; // Double 포인터
 

위 코드를 실행하게 되면 컴파일러는 아래의 그림과 같은 코드를 메인 메모리에 만들 것이다.
그림에서 볼 수 있듯이, Single 포인터 pt1은 한번 "지시"를 하고, Double 포인터 pt2는 두 번 "지시"를 한다. 참조 할 때에도 마찬가지이다. pt1은 한번 참조를 통해 100 이라는 값을 얻고 (즉, *pt1;), pt2는 두 번 참조를 통해 100 이라는 값을 얻는다 (즉, **pt2;). 어떻게 하면 두 번 "지시"를 할 수 있을까?
그 해답은 아주 간단하다. Single 포인터의 주소를 저장하면 우리는 두 번 "지시"를 할 수 있다. 이것이 Double 포인터의 기능이다.

Double 포인터는 어떤 용도로 사용 하는가?
  동적인 2차원 배열을 만들 때 주로 사용 되어 진다.





위의 예제 코드에서, Single 포인터는 int형의 주소를 저장하고 Double 포인터는 int*형의 주소 (즉, Single 포인터의 주소)를 저장한다.

포인터에 대해 도저히 감히 잡히지 않는 다면은 아래의 코드와 같이 괄호를 사용하여 묶어 보라. 괄호를 제외한 부분이 저장되는 주소이다. 첫 번째 Single 포인터의 경우 int 가 남는다. 따라서 int형의 주소가 저장 된다. 그리고 두 번째 Double 포인터의 경우는 int* 가 남는다. 따라서 int*형의 주소 (즉, Single 포인터의 주소)가 저장 된다.

int     val = 100;
int  (*pt1) = &val; // Single 포인터
int *(*pt2) = &pt1; // Double 포인터
 

Triple 포인터도 위와 마찬가지로 이해하면, 우리는 쉽게 int**형의 주소 (즉, Double 포인터의 주소)가 저장 된다는 것을 알 수 있다.

괄호를 묶는 방법은 가급적 쓰지 마라.
  실질적으로
괄호 묶는 방법을 사용하는 개발자는 잘 없기 때문에, 다른 개발자가 쓴 Code를 이해하
  지 못하는 경우가  생긴다.
Creative Commons License
Creative Commons License
명언 한마디
남에게 자기를 칭찬하게 해도 좋으나, 자기 입으로 자기를 칭찬하지 말라.
탈무드
top