C포인터와 메모리

이중 포인터

포인터의 주소를 다시 넘겨 원본 포인터를 바꾸는 이중 포인터 패턴을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

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 **ppint *를 가리키는 포인터
호출자 포인터 수정함수 밖 포인터를 바꾸려면 주소를 넘김
argv문자열 포인터들의 배열이라 이중 포인터 해석이 중요
동적 할당 함수T **out 형태로 결과 포인터를 돌려주는 패턴이 흔함
역참조 단계*pp는 포인터, **pp는 실제 값

주의할 점

이중 포인터는 어느 단계가 NULL인지 헷갈리기 쉽습니다. pp 자체, *pp, 그리고 최종 대상 **pp를 구분해서 검사해야 합니다.