열혈C - Chapter 17 포인터의 포인터

2024. 10. 13. 18:54Programming Language/C

포인터는 상수, 변수의 형태를 띌수 있다.

상수로는 변수의 이름을 대표적으로 볼 수 있고, 변수의 형태는 대표적으로 포인터 변수를 볼 수 있다.

그런데 사실 그냥 궂이 이렇게 나눠서 이야기하지는 않는다.

보통은 대부분 포인터라고 한다면 포인터 변수를 이야기 하지만 그렇지 않은 경우도 있다는걸 알아두자.

여기서 이야기할 내용은 포인터 변수에 대한 내용이다.

 

Chapter 17에서 말하고자 하는 가장 핵심이 되는 내용은 이런것이다.

 

이전에 

int num = 12;
int * ptr = #

과 같이 사용했었다.

여기서 ptr에 &num으로 num의 주소값을 전달해줌으로써 포인터 ptr이 num을 바라보도록 했었다.

그렇다면 

???? = &ptr

이 ptr의 주소값을 담는 변수의 타입은 어떻게 될까?

 

기본적으로 주소값을 저장해서 그걸 갖고 실제 값의 조작을 위해 변수를 생성한다면, 주소값을 저장한 변수의 타입에 *를 붙여 포인터를 생성했었다.

그 이유는 이전에 말했던것 처럼 해당 주소값만 갖고는 바라보는 변수가 갖고 있는 값의 형태를 인식하지 못하기 때문이다.

그래서 그 형태는 

TYPE 변수명 = 123;
TYPE * 포인터변수명 = &변수명;

과 같은 형태였었다.

 

그렇다면 위에 ptr의 타입에 *를 붙인 후에 포인터를 생성하면 포인터 변수의 주소값을 담는 포인터 변수가 선언될 것이다.

그 형태는 

TYPE 변수명 = 123;
TYPE * A포인터변수명 = &변수명;
TYPE * * B포인터변수명 = &A포인터변수명;

이 되게 된다.

 

그냥 결론은 포인터변수를 포인터변수에 담으려면 *을 타입에 하나 더붙여주면 된다는 것이 전체적인 내용이다.

 

그리고 포인터 변수의 포인터 변수를 구분하기 위해서, 명칭을 그냥 기존의 포인터 변수의 경우는 Single Pointer Variable, 싱글 포인터 변수라고 부르고 이 싱글 포인터 변수를 담는 포인터 변수를 Double Pointer Variable, 더블 포인터 변수라고 부른다.(한글로는 이중 포인터 변수라고 하기도 한다.)

 

17-1 포인터의 포인터에 대한 이해

포인터 변수를 가리키는 이중 포인터 변수

double num = 3.14;
double * ptr = #
double ** dptr = &ptr;

위 상황에서 *dptr은 포인터 변수 ptr을 의미하고 *(*dptr)은 변수 num을 의미하게 된다.

 

17-2 다중 포인터 변수와 포인터의 필요성

이중 포인터를 가리키는 삼중 포인터

그럼 이전에 이중 포인터를 만들었을 때와 비슷하게 이중 포인터 변수의 주소값을 담는 용도로 3중 표인터를 사용할 수 도 있다.

이렇게 이중 포인터 변수의 개념을 그대로 확장해서 이해할 수 있는것이 삼중 포인터이다.

 

포인터의 필요성은 어디서 찾아야 하는가?

  • scanf 함수와 같이 함수 내에서 함수 외부에 선언된 변수의 접근을 허용하기 위해서
  • 메모리의 동적 할당 등, PART 04에서 공부 하는 내용을 통해서 포인터의 필요성을 다양하게 이해하게 된다.
  • 향후에 자료구조라는 과목을 공부하게 되면 보다 넓게 필요성을 이해할 수 있게 된다