소프트웨어/C 언어

[C언어]32. 메모리를 직접 관리하는, 포인터에 대하여 알아보자 ( 이중포인터 )

리습 2013. 9. 26. 15:40


 안녕하십니까. 리습입니다.


 포인터 중에서도 특이한 포인터가 있습니다. 바로 '포인터 주소를 저장하는 포인터' 입니다. 포인터가 '주소값'을 저장하기 때문에 생기는 특이한 포인터죠. 아직 포인터의 응용을 배우진 않았기 때문에 왜 존재하는지 의문이긴 하시겠지만, 우선은 이런것이 있다. 정도로 이해해주시기 바랍니다.


 포인터의 주소를 저장하는 포인터 


 포인터라는 것도 특정 값을 저장하는 변수이기 때문에 메모리 공간을 점유하고 있습니다. 또한 메모리상의 '주소값'을 가지고 있죠. 그런데 포인터는 '참조(접근)' 할 수 있는 기능이 있기 때문에 포인터의 메모리 주소를 일반 포인터로 저장한다면 '참조'할때 문제가 생기죠. 쉽게 그림으로 보도록 하겠습니다.


 int 포인터를 통해서 int 변수를 가리키는 상황입니다. 이 상태라면 포인터 연산자 '*'를 사용하여 쉽게 int 변수의 내용에 접근할 수 있겠죠. 그런데 여기서 int 포인터 변수를 또 다른 포인터 변수로 가리킨다고 가정해봅시다.




 1번 포인터는 int 변수를 가리키고 있는 상태(주소값을 저장한 상태)이며 2번 포인터는 1번 포인터를 가리키고 있는 상태입니다. 한마디로 포인터가 포인터를 가리키고 있는 상태지요. 1번 포인터에서 int 변수로의 접근은 종전과 같습니다. 단순히 연산자 '*'를 사용하면 가능한것이죠. 하지만 2번포인터에서 int 변수로의 접근을 생각해봅시다. 단순하게 2번포인터에서 연산자를 통해 접근을 하게 된다면 1번 포인터의 값 이 출력될 것 입니다. 즉 우리가 원하는 int변수의 값이 아닌 1번 int 포인터가 가리키고 있는 int 변수의 주소값이 출력된다는 것이지요. 이것은 명백하게 잘못된것입니다. 우리가 의도하지 않은 결과값이 나오게 되니까요. 해결하는 방법은 여러가지가 있겠으나 C언어에서는 이 상황을 해결하기위해 이중포인터라는 것을 만들었습니다.


이중 포인터 


 한마디로 이중포인터란 포인터를 가리키기 위한 포인터 입니다. 이중포인터를 이용하게 되면 자신이 가리키는 포인터가 가리키는 변수의 값으로 바로 접근이 가능하게 되죠. 선언 방법은 다음과 같습니다.

 원래 포인터를 선언하는 방식에서 *를 하나더 붙이는것 뿐입니다. 이것은 이중포인터다 라고 표시해주는 것이지요. 사용은 원래 포인터와 같으나 단지 접근을 할때(가리키고 있는 값을 호출할 때)에는 ** 이라고 표시해주어야 합니다. 그럼 코드를 보면서 이해해보도록 하겠습니다.


 코드

 #include <stdio.h>

 int main( void )

 {

      // 변수와 첫번째 포인터 생성

      int a = 9999;

      int *ptr = &a;


      // 두번째 포인터 생성, 이중포인터

     

      int **pptr = &ptr;

     // 확인

     printf("변수 a\n값 : %d\n주소 : %d\n", a, &a);

     printf("포인터 변수 ptr\n값(가리키는주소) : %d\n주소 : %d\n", ptr , &ptr);     

     printf("이중포인터 변수 pptr\n값(가리키는주소) : %d\n주소 : %d\n", ptr , &ptr); 

     printf("**pptr 의 값은 %d 입니다. \n", **pptr);

     

     return 0;

 }

  결과

  

 변수 a

 값 : 9999

 주소 : 2293620

 포인터 변수 ptr

 값(가리키는주소) : 2293620

 주소 : 2293616

 이중포인터 변수 pptr

 값(가리키는 주소) : 2293616

 주소 : 2293612

 **pptr의 값은 9999 입니다.

 


 결과 값에서 주소는 컴퓨터마다 컴파일할때 마다 달라질 수 있습니다. 결과를 보게 되면 포인터가 가리키는것 이중포인터가 가리키는 값 그리고 접근할때의 결과값이 나옵니다. 즉 이중포인터는 포인터를 가리킬때 쓰인다는 것입니다.


 이렇게 이중포인터만 가지고 설명을 하면 왜 이런게 있는지 이해가 안되실겁니다. 하지만 조금뒤에 포인터의 강력한 무기중 하나인 동적할당에 대해서 알게 된다면 이중포인터가 왜 필요한지 아시게 될겁니다. 


 참고로 이중포인터를 가리키는 포인터는 삼중포인터라고 하며 ***을 사용하여 선언합니다.( ex) int ***ptr ) 사용법은 이중포인터랑 비슷하며 거의 사용되지 않으니 알아만 두시면 됩니다.