C 언어 | 포인트 | 포인터의 포인터


주소를 저장하는 포인터도 편집의 일종이며, 포인터 자신도 주소가 있다. 주소 연산자를 사용하여 포인터의 주소 즉, 포인터에 대한 포인터를 얻을 수 있다.

포인터의 주소

포인터의 실체는 참조된 주소를 나타내는 숫자를 저장하는 일종의 변수라고 설명했다. 포인터도 주소를 저장하는 변수의 일종이며, 포인터 자신의 주소가 존재한다. 말이 반복되지만, 포인터의 포인터를 만들 수 있다는 것이다. 즉, 포인터의 주소를 다른 포인터에 저장하는 것이 가능하다.

포인터의 포인터가 참조하는 포인터이며, 이 포인터에서 더 참조할 수 있는 원래의 변수에 액세스할 수 있다. 이러한 다중 간접 참조의 이해는 포인터의 개념에서 중요한 부분이므로 확실히 이해하도록 한다. 포인터의 포인터를 선언하려면 별표 *를 더 추가한다.

포인터의 포인터 선언

형식 **변수명;

다중 간접 참조하려면 역시 간접 연산자 *를 참조하는 수준만큼 지정한다. 포인터의 참조 횟수가 많아지면 처리 속도에도 영향을 주기 때문에, 무의미한 다중 간접 참조는 좋을 것이 없다. 그러나 개발자가 보유하고 있는 포인터를 다른 함수에서 제어하고 싶은 경우에, 포인터의 포인터가 이용될 수 있다.

#include <stdio.h>

int main() {
  int iVariable = 100;
  int *ip = &iVariable;
 int **ipp = &ip;

  printf("--ip 포인터가 나타내는 값--\n");
  printf("주소 = %p\n" , &ip);
 printf("저장 주소 = %p\n" , ip);
 printf("저장 주소 내용 = %d\n\n" , *ip);

  printf("--ipp 포인터의 포인터가 나타내는 값--\n");
  printf("저장 값  = %p\n" , ipp);
  printf("저장 주소의 내용 = %p\n" , *ipp);
 printf("저장 주소 주소 내용 = %d\n", **ipp);

 return 0;
}

코드1은 정수 100을 저장하는 변수 iVariable과 iVariable의 주소를 저장하는 포인터 ip, 그리고 ip로 주소를 저장하는 포인터의 포인터 ipp가 정의되어 있다. 이 프로그램에서는 포인터와 “포인터의 포인터 ‘의 관계를 이해하기 위해 printf() 함수에서 각종 정보를 표시한다. 표시되는 주소는 실행시기에 따라 다르지만 위의 결과처럼 될 것이다.

포인터 ip 주소를 주소 연산자 &로 얻을 수 있다. 포인터의 포인터 ipp는 이를 저장하고 있기 때문에 ip 주소와 ipp의 저장 값은 동일하다는 것을 확인할 수 있다. 또한 포인터의 포인터 ipp을 간접 참조하는 것은 ip가 저장한 값을 참조한다는 것이다. ipp 저장하는 주소의 내용과 ip가 저장 주소가 동일한 지에서이를 확인할 수 있다.

포인터의 포인터에서 원래 변수의 값을 참조하려면 다중 간접 참조를 해야 한다. **ipp로 작성하여 다중 간접 참조를 하고, 마지막 printf() 함수에서 ipp가 저장한 주소(즉 ip)가 저장 주소(즉, iVariable)를 참조하고 있다.