(C++) 6.16 이중 포인터와 동적 다차원 배열

이준우·2021년 11월 6일
0

우리가 포인터라는 것을 알게 됬으니, 이젠 이중 포인터, 삼중 포인터에 대한 개념도 알아보자. 역순(?) 이라고 생각하면 될듯하다.

Cout을 사용하여 console에 출력을 하는 첫 번째 코드는 모두가 이해했으리라 생각한다. 지금까지 배워왔던 포인터의 개념이니깐 말이다.

그럼 이제 두번째 코드를 이해해보자.

  • ptrptr은 포인터 ptr에 대한 주소를 갖고 있다. 따라서 ptrptr == &ptr과 동일한 결과를 갖는다.
  • *ptrptr은 &ptr에 들어가 있는 값을 갖고 온다. ptr = &vlaue의 주소를 넣었으니 당연히 주소가 출력된다.
  • &ptrptr은 자신만의 메모리 주소를 갖고 있으므로 다른 값이 나오게 된다.

마지막으로 세번째 코드를 이해해보자.

  • **ptrptr은 &ptr이 갖고 있는 값을 의미한다. 따라서 5가 출력된다.

보통 이중포인터는 이차원 행렬을 구할때 많이 사용한다. 이차원 행렬을 이런 식으로 구현하기도 한다. 동적 할당을 사용하여 위와 같은 구조로 동작하도록 만든다.

제일 이해가 안되는 부분이 int **rows = new int *[row] {r1, r2, r3};일 것인데, 이를 그림으로 좀더 쉽게 이해해보자.

  1. int **mat = new int *[row];

이중 포인터인, 즉 int을 저장할 수 있는 포인터인 mat에 int 데이터 (즉, int를 저장할 수 있는 포인터)를 row개를 저장할 수 있는 배열을 동적으로 생성하고 이 배열의 시작 주소를 mat에 저장한다.
위와 같은 그림으로 표현이 가능한데, 아직 초기화는 되지 않은 상태이며 배열은 비어있고 할당만 받은 상태이다.

  1. 첫번째 for문 mat[r] = new int[col];

이해를 돕기 위해 mat가 가리키는 배열을 세로로 눕혀 그려보았다. mat의 원소는 int*이므로 mat의 row 개의 원소들이 각각 col 개의 int 배열의 주소를 가리킬 수 있도록 해주는 작업이다. 즉, col 개의 크기를 가진 int 배열을 row 개 만큼 동적으로 할당받아 만들고 이를 각각 mat가 가리키는 배열의 원소들에 "값으로 저장" 되어지는 것이다.

  1. 두번째 for문 mat[r][c] = arr[r][c];

이제 이 단계에서 mat 원소들이 가리키는 배열의 원소들에 하나하나 값을 넣어 초기화 해준다.


제대로 이해해야 한다. int *r3 = new int[col] {11, 12, 13, 14, 15};에서 포인터를 사용하는 이유는 배열과 포인터는 같아서 이다. 즉 동적할당으로 받은 배열의 첫 주소를 r3에 넣어두는 것이다. &연산자를 사용하지 않는 이유는 바로 배열이 주소이기 때문이다.

int **rows = new int*[row] {r1, r2, r3}; 여기 부분에서 포인터를 사용하여 동적할당하는 이유는 다음과 같다. {}안의 원소들이 주소값이기 때문이다. 따라서 이중 포인터를 사용하여 받아준다.


마지막에 delete 같은 경우에는 좀 여러번 쓰기 귀찮으니 이를 for문을 사용하여 초기화를 해보려고 한다. 자 이러한 경우이다. 생각보다 복잡하다 ㅠㅠ..
위의 내용을 토대로 한번 자신이 써보며 이해하길 바란다.


이것은 이중포인터는 살짝 이해하기 어려울 수 있으니 포인터 한개만 사용하여 구현해 보았다. 포인터의 개념이 어느정도 정착되었다면, 쉽게 이해할 수 있을 것이다.

profile
꿈꾸는 CV

0개의 댓글