C/C++ 포인터의 일반적인 사용 수준
실제 C 프로그램에서 자주 사용되는 포인터의 정적(static) 수준은 한두 단계가 일반적입니다. 예를 들어 int *p(단일 포인터)나 int **pp(이중 포인터) 정도가 대표적이며, 삼중 간접 참조(triple indirection)는 실무에서 드물게 등장합니다.
하지만 흥미롭게도 무한한 수준의 포인터 간접 참조는 매우 흔하게 볼 수 있습니다. 그 핵심 열쇠는 바로 구조체(struct)입니다.
구조체를 활용한 무한 간접 참조
자기 자신과 같은 타입의 포인터를 멤버로 가지는 구조체를 정의하면, 포인터 체인을 원하는 만큼 계속 이어갈 수 있습니다.
struct list { struct list *next; ... } lst;
lst->next->next->next->...->next이러한 방식으로 여러 단계의 포인터 간접 참조를 손쉽게 구현할 수 있습니다. 대표적인 예가 연결 리스트(linked list)입니다. 각 노드가 다음 노드를 가리키는 포인터를 담고 있어, 런타임에 노드를 계속 추가함으로써 간접 참조의 깊이가 사실상 무한히 늘어날 수 있습니다. 트리(tree), 그래프(graph) 같은 동적 자료구조도 같은 원리로 동작합니다.
다른 표기법으로 나타내기
위의 화살표(->) 연산자를 사용한 표기는 아래와 같이 역참조 연산자(*)와 점(.) 연산자를 조합한 형태로도 표현할 수 있습니다.
*(*(..(*(*(*lst).next).next).next...).next).next
두 표기법은 완전히 동일한 의미를 가지며, ptr->member는 곧 (*ptr).member와 같습니다. 다만 가독성을 위해 실제 코드에서는 화살표 연산자를 사용하는 것이 일반적입니다.