안녕하세요
ITSkeleton 입니다.
이번에는 2차원 포인터에 대해서 알아볼 예정입니다.
저번에 2차원 배열에 대하여 적은 것이 있는데요.
비슷하지만 다릅니다.
포인터를 쓰는 이유는
저번에 저의 설명과 같이 메모리 공간 절약을 위해 사용하는 것입니다.
먼저 포인터의 배열은 어떻게 만들면 될까요?
int *point[5];
이렇게 적으시면
세로로 5개이고 가로는 가변 공간을 만들어서 사용할수 있습니다.
마찬가지로 malloc 함수를 이용해서
공간을 부여하고
사용 할수 있습니다.
말그대로 포인터 여러개를 배열로 묶어서 만든것이
포인터의 배열 입니다.
두번째! 배열의 포인터 입니다.
배열은 가로가 정해져 있지요.
어떻게 만들수 있을까요?
int (*point)[5];
이렇게 적어주시면
가로로 5개이고 세로로 가변 공간을 만들어서 사용할 수 있는
배열의 포인터 입니다.
뭔가 포인터의 배열과 다를거 없어보이는 선언법이지만...
저렇게 사용하는 것이 약속 같은 거라고 할수 있겠네요..
세번째! 드디어 2차원 포인터 입니다.
어떻게 선언을 시킬수 있을까요?
int **point;
위와 같이 **를 붙여주면
가로세로 모두 가변 공간을 만들수 있는
2차원 포인터를 선언한 것입니다.
마찬가지로 malloc 함수를 사용해서 각각 공간을 부여해 사용 가능합니다.
포인터의 배열과 배열의 포인터 같은 경우에는
예시를 들어가며 설명하지 않겠습니다.
하지만, 2차원 포인터는 예시를 드는것이 이해하기가 쉬울거라 생각되서
2차원 포인터만 예시를 작성해 보겠습니다.
int count = 5;
int count2 = 6;
int **point;
이렇게 변수 두개와 2차원포인터 함수를 선언했습니다.
point = (int **)malloc(sizeof(int*)*count);
(카운트 앞의 별은 곱하기의 별입니다.)
이와 같이 malloc 함수를 통하여 공간을 부여 했습니다.
그런데 어디에 공간을 부여했을까요?
2차원이라고 하면
point[][] 이런 형식이 되어야 할텐데 말이지요
쉽게 설명 하기위해
point[count][]
바로 앞부분에 공간을 할당해 주는 코드입니다.
(int**) 별이 두개가 붙어 있고
sizeof에 별이 하나 붙어 있지요?
이유불문 저렇게 선언하고 사용한다면 2차원 공간에 포인터 공간을 할당해 주는 것입니다. (세로의 길이)
2차원을 채워 주었으니 1차원도 채워 주어야 겟지요?
point = (int*)malloc(sizeof(int)*count2);
1차원 포인터에 공간을 설정하는 것과 똑같은 코드입니다.
이렇게 두개다 설정을 해주고나면
point[count][count2]
point[5][6]
이렇게 가로 6개 세로 5개인 공간을 할당해 줍니다.
이해가 되셧는지요...
이해가 안되는 부분은 댓글 남겨주시면 답해드리겠습니다.
그리고 공간을 할당하고 사용을 모두 끝냈을때에는
free(point)
를 해주어서 반드시 할당받은 공간을 돌려주도록 합시다!