31.6 이중 포인터 사용하기
지금까지 변수의 포인터를 선언했습니다. 그렇다면 포인터의 포인터도 가능하지 않을까요? 이번에는 포인터의 메모리 주소를 저장하는 포인터의 포인터를 선언해보겠습니다.
포인터를 선언할 때 *를 두 번 사용하면 포인터의 포인터(이중 포인터)를 선언합니다.
- 자료형 **포인터이름;
double_pointer.c
#include <stdio.h> int main() { int *numPtr1; // 단일 포인터 선언 int **numPtr2; // 이중 포인터 선언 int num1 = 10; numPtr1 = &num1; // num1의 메모리 주소 저장 numPtr2 = &numPtr1; // numPtr1의 메모리 주소 저장 printf("%d\n", **numPtr2); // 20: 포인터를 두 번 역참조하여 num1의 메모리 주소에 접근 return 0; }
실행 결과
10
포인터도 실제로는 변수이기 때문에 메모리 주소를 구할 수 있습니다. 하지만 포인터의 메모리 주소는 일반 포인터에 저장할 수 없고, int **numPtr2;처럼 이중 포인터에 저장해야 합니다. int **numPtr2;를 영어로 읽으면 pointer to pointer to int가 됩니다(numPtr2 → numPtr1 → num1).
여기서 이중 포인터 numPtr2를 끝까지 따라가서 실제 값을 가져오려면 **numPtr2처럼 변수 앞에 역참조 연산자를 두 번 사용하면 됩니다. 즉, 역참조를 두 번 하므로 numPtr2 ← numPtr1 ← num1과 같은 모양이 되고 num1의 값을 가져올 수 있습니다.
포인터를 선언할 때 *의 개수에 따라서 삼중 포인터, 사중 포인터 그 이상도 만들 수 있습니다. 마찬가지로 역참조를 할 때도 *를 세 번, 네 번 또는 그 이상 사용할 수 있습니다.