이번 강좌에서는 2차원 배열과 포인터에 대하여 알아보도록 하겠습니다.

2차원 배열은 행과 열로 이루어진 배열이라고 하였습니다. 그럼 실제적으로 행과 열로 선언이 되는 것일까요? 다음과 같이 int M[2][3]={1,2,3,4,5,6}; 이라고 배열이 선언되었습니다. 행부터 값이 먼저 입력이 됩니다. 실제적으로 메모리에 잡히는 모양은 행과 열로 이루어진 모양이 아니라 다음과 같이 일렬로 선언이 됩니다. 2차원 배열을 배울시 이해하기 쉽게 하기 위하여 행과 열로 표현을 한 것 뿐입니다.

     ------------------------------------------------------------
     |      1      |      2      |      3      |      4      |      5      |      6      |
     ------------------------------------------------------------
       M[0][0]    M[0][1]   M[0][2]    M[1][0]   M[1][1]   M[1][2]
     |__________ M[0]행 ___________|
    ↑             ↑             ↑             ↑             ↑             ↑      
65514         65516       65518        65520        65522        65524    

이와같이 일렬로 메모리에 선언이 되게 됩니다.

그럼 2차원 배열에서 외워야 할 것을 알아보겠습니다.

"2차원 배열에서는 행 이름이 해당 행의 시작주소를 의미한다. 행 이름에 1번지 증가시키면 요소 1개 크기의 byte가 증가한다."

예제를 들어보겠습니다.

---------------------------------------------------------------------
#include <stdio.h>
void main()
{
   int M[2][3] = {1,2,3,4,5,6};
   printf("%lu %lu\n", &M[0][0], &M[0][1]);
   printf("%lu\n", M[0]);
   printf("%lu\n", M[1]);
   printf("%lu\n", M[0]+1);
   printf("%d\n", *(M[0]+2));
   printf("%d\n", *(M[1]+1));
}
---------------------------------------------------------------------
int M[2][3] = {1,2,3,4,5,6}; 문장은 2차원 배열 M을 선언하고 값을 대입하였습니다.

     ------------------------------------------------------------
     |      1      |      2      |      3      |      4      |      5      |      6      |
     ------------------------------------------------------------
       M[0][0]    M[0][1]   M[0][2]    M[1][0]   M[1][1]   M[1][2]
     |__________ M[0]행 ___________|
    ↑             ↑             ↑             ↑             ↑             ↑      
65514         65516       65518        65520        65522        65524    
다음과 같이 선언되었다고 하겠습니다.

printf("%lu %lu\n", &M[0][0], &M[0][1]); 문장은 M[0][0], M[0][1] 의 주소를 출력하라는 의미입니다. 65514 65516 이라고 출력이 될 것입니다.

printf("%lu\n", M[0]); 은 무엇을 의미할까요? M[0]은 2차원 배열 M[0]번째 행을 의미합니다. 아까 암기하라고 한 부분에서.."2차원 배열에서는 행 이름이 해당 행의 시작주소를 의미한다." 라는 부분이 있습니다. 즉 여기서 M[0]번째 행의 시작주소를 출력하라는 의미이므로 65514 출력이 됩니다.

printf("%lu\n", M[1]); 문장은 2차원 배열 M[1]의 행 시작주소를 의미하겠죠. 그러므로 65520 이라는 주소값이 출력이 됩니다.

printf("%lu\n", M[0]+1); 문장에서 M[0]+1 은 무엇을 의미할까요. 암기하는 부분에서...."행 이름에 1번지 증가시키면 요소 1개 크기의 byte가 증가한다." 다음과 같은 부분이 있었습니다. M[0]은 행이름을 뜻하고 +1은 1번지를 증가시킨다는 의미입니다. M[0]은 0번째 행의 시작주소를 의미하고 +1을 하면 1개의 요소만큼 바이트수가 증가하므로 int 형이므로 2바이트가 증가하게 될것입니다. 즉 &M[0][1] 을 의미하게 되겠지요. 64416 이라는 값이 출력이 됩니다.

printf("%d\n", *(M[0]+2)); 문장에서 *(M[0]+2) 의 의미를 알아보도록 하겠습니다. 일단 (M[0]+2)의 의미는 &M[0][2]를 의미한다고 하였습니다. 그리고 앞에 * 붙었으므로 그곳에 해당되는 기억공간을 의미합니다. 그러므로 3이라는 값이 출력이 되겠지요.

printf("%d\n", *(M[1]+1)); 문장의 의미도 아시겠죠. 5라는 값이 출력됩니다.

M[1][2] 을 포인터식으로 바꾸면 *(M[1]+2) 이렇게 표현이 가능하다는걸 아시겠죠.

이로써 2차원배열과 포인터에 대하여 알아보았습니다. 특별히 어려운건 없지만 생소한 개념이라 이해하시기가 어려우실 것입니다. 반복적으로 보아가며 이해하시길 바라겠습니다. 수고하셨습니다.


자료출처 : http://higasijoe.nasse.net/

'자료구조 & 알고리즘' 카테고리의 다른 글

그래프 알고리즘 연습.  (0) 2007.03.14
2차원배열의 포인터  (0) 2007.03.14
연결리스트 구현 문제요  (0) 2007.03.14
이진탐색트리의 완결판!!!!  (1) 2007.03.14
Posted by Real_G