기본 패턴
c
int value = 10;
int *ptr = &value;
int **pp = &ptr;
**pp = 20;설명
- 이중 포인터는 "포인터를 가리키는 포인터"입니다.
- 함수 안에서 호출자 쪽 포인터를 바꾸려면 포인터 값의 복사본이 아니라 그 포인터의 주소를 넘겨야 합니다.
- 동적 메모리 할당 결과를 함수 밖으로 전달하거나, 문자열 배열처럼 포인터의 배열을 다룰 때 자주 등장합니다.
*의 개수가 늘어날수록 무엇이 값이고 무엇이 주소인지 차근차근 따라가는 습관이 중요합니다.
짧은 예제
c
#include <stdio.h>
#include <stdlib.h>
int allocate_int(int **out) {
*out = malloc(sizeof **out);
if (*out == NULL) {
return 0;
}
**out = 42;
return 1;
}
int main(void) {
int *ptr = NULL;
if (allocate_int(&ptr)) {
printf("%d\n", *ptr);
free(ptr);
}
return 0;
}빠른 정리
| 항목 | 설명 |
|---|---|
int **pp | int *를 가리키는 포인터 |
| 호출자 포인터 수정 | 함수 밖 포인터를 바꾸려면 주소를 넘김 |
argv | 문자열 포인터들의 배열이라 이중 포인터 해석이 중요 |
| 동적 할당 함수 | T **out 형태로 결과 포인터를 돌려주는 패턴이 흔함 |
| 역참조 단계 | *pp는 포인터, **pp는 실제 값 |
주의할 점
이중 포인터는 어느 단계가 NULL인지 헷갈리기 쉽습니다. pp 자체, *pp, 그리고 최종 대상 **pp를 구분해서 검사해야 합니다.