C 언어에서 이중 포인터(double pointer), 즉 '포인터를 가리키는 포인터'를 선언하는 방법은 일반 포인터를 선언하는 것과 거의 같습니다. 차이점은 포인터 이름 앞에 별표(*)를 하나만 더 붙이면 된다는 점입니다.
문법(Syntax)
이중 포인터를 선언할 때 사용하는 기본 문법은 다음과 같습니다.
int **ptr;
위 선언에서 ptr은 int * 타입 변수의 주소를 저장하는 포인터입니다. 한 번 역참조(*ptr)하면 일반 포인터에 접근하고, 두 번 역참조(**ptr)하면 실제 정수 값에 도달하게 됩니다.
예제
다음은 포인터의 포인터(pointer to pointer)의 동작을 보여주는 C 프로그램입니다.
#include<stdio.h>
// 포인터의 포인터를 시연하는 C 프로그램
int main(){
int element = 24;
// element 변수를 가리키는 단일 포인터
int *ptr2;
// ptr2를 가리키는 이중 포인터
int **ptr1;
// element의 주소를 ptr2에 저장
ptr2 = &element;
// ptr2의 주소를 ptr1에 저장
ptr1 = &ptr2;
// 단일 포인터와 이중 포인터로 각각 값 출력
printf("element value = %d\n", element);
printf("element value using single pointer = %d\n", *ptr2);
printf("element value using double pointer = %d\n", **ptr1);
return 0;
}
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
element value = 24
element value using single pointer = 24
element value using double pointer = 24
동작 원리
ptr2에는 변수 element의 메모리 주소가 저장되고, ptr1에는 포인터 ptr2의 메모리 주소가 저장됩니다. 따라서 *ptr2는 element의 값(24)을 반환하며, **ptr1은 ptr1 → ptr2 → element 순으로 두 번 역참조하여 결국 같은 값 24에 도달하게 됩니다.
이러한 이중 포인터는 2차원 배열의 동적 할당, 함수 내에서 포인터 자체를 수정해야 하는 경우, 연결 리스트나 다차원 데이터 구조 처리 등에 널리 활용됩니다.