Programming Language/C,C++

C, C++] 이중 포인터를 이용해 2차원 배열 사용하기

TwinParadox 2018. 5. 16. 20:39
728x90

동적 할당을 사용하면 포인터는 배열처럼 사용할 수 있다.

여기까진 포인터를 어렴풋이 아는 입문자들도 포인터의 연산과 배열의 인덱스를 연관지어 어렵지 않게 이해할 수 있는 부분인데, 문제는 이중 포인터를 이용해서 2차원 배열을 선언할 때 발생한다.


일단 본론에 들어가기 앞서, 포인터를 이용해서 배열을 사용하는 방법을 그림과 식으로 이해해보자.



C

int* ptr = NULL;
ptr = (int*)malloc(sizeof(int)*5);



C++

int* ptr = nullptr;
ptr = new int[5];



어렵지 않게 요소 5개 짜리 int형 배열을 동적 할당했다. 포인터를 외우듯 공부한 사람들이어도 아래 그림까지는 어렵지 않게 그려내고 이해할 수 있다.







이제 2차원 배열을 어떻게 동적 할당할 지 생각해보자. 5x5의 이차원 배열을 만들고자 한다고 가정하자.



C

int** ptr=NULL;
ptr = (int**)malloc(sizeof(int*)*5);
for(int i=0;i<5;i++)
   ptr[i] = (int*)malloc(sizeof(int)*5);



C++

int** ptr = nullptr;
ptr=new int*[5];
for(int i=0;i<5;i++)
   ptr[i]=new int[5];



일단 코드부터 살펴보자, 이중포인터에 포인터 배열을 이용해서 동적할당을 해주고, 포인터 배열의 인덱스 각각에 요소 5개짜리 int형 배열을 동적할당하는 방식으로 이차원 배열을 동적할당 했다. 


"포인터 배열의 요소들은 각각 5개짜리 int형 배열의 첫 번째 부분의 주소값을 할당해줬다. 이중포인터는 그러한 포인터 배열의 시작을 가리킨다."


포인터를 사용할 줄 안다면 위 문장에 대해서 이해했다고 본다. 더 나아가, 이보다 더 좋은 문장으로 어떻게 이것이 2차원 배열을 형성하는지에 대해서 설명할 수 있을 것이라 생각한다. 그런 사람들은 더 이상 볼 필요 없이 뒤로가기를 눌러도 좋다. 그렇지 않다면 아래 그림을 보자.






이중포인터로 포인터 배열에 접근하고, 각 포인터 배열의 요소들을 활용해 1차원 배열을 사용할 수 있다는 점을 생각하면, 2차원 배열이 되는 것은 당연하다. 그림은 그것에 대해서 설명해주고 있는 것이다.


포인터로 메모리를 동적 할당해서 잘 써먹었다면 해제를 해줘야 한다. 그렇게 하지 않고 무한정 계속 메모리를 할당 받기만 한다면 필히 문제가 될 것이다. 어떤 부분에서 필요한 메모리를 할당 받아 잘 사용했다면, 더 이상 필요 없어지는 시점이나, 그러한 작업을 하는 함수 등에서 메모리 해제를 해주는 습관을 들이는 것이 좋다.


동적 할당을 해서 잘 썼으면 해제도 잘 해줘야 한다.

여기에 관해서는 '조립은 분해의 역순이다.'이라는 문장이 가장 잘 어울린다고 생각한다. 물론, 메모리 해제는 조립은 아니지만 그냥 처리 순서만 놓고 이야기하면 딱 맞는 이야기다. 여기에 이 문장을 그대로 적용시키면, 포인터 배열에 할당한 메모리를 해제해주고 그 포인터 배열을 가리키고 있던 이중 포인터를 해제해주면 된다는 이야기다.



C

for (int i = 0; i < 5; i++)
	free(ptr[i]);
free(ptr);




C++

for (int i = 0; i < 5; i++)
	delete ptr[i];
delete ptr;


728x90
728x90