C

[C언어] 이중 포인터(Double Pointer) 정리

연화 2025. 3. 26. 12:20

C언어에서 포인터도 어렵지만, 그 위에 포인터를 또 가리키는 이중 포인터(double pointer)는 진입 장벽이 훨씬 높습니다. 하지만 이중 포인터는 고급 C프로그래밍, 동적 메모리 할당, 다차원 배열 처리, 함수 포인터 제어 등에서 핵심 역할을 하므로 반드시 제대로 알고 넘어가야 합니다.

 

📌 이중 포인터란?

이중 포인터는 말 그대로 포인터를 가리키는 포인터입니다.

int a = 100;
int *p = &a;
int **pp = &p;
  • a: 일반 변수
  • p: a의 주소를 저장하는 포인터
  • pp: p의 주소를 저장하는 이중 포인터

이 관계를 메모리로 표현하면 다음과 같아요

 
[ a ] = 100         → 변수
[ p ] = &a          → 포인터
[ pp ] = &p         → 이중 포인터

 


 

📌 이중 포인터 사용 예제

#include <stdio.h>

int main() {
    int a = 42;
    int *p = &a;
    int **pp = &p;

    printf("a의 값: %d\n", a);         // 42
    printf("p가 가리키는 값: %d\n", *p);   // 42
    printf("pp가 가리키는 값: %d\n", **pp); // 42

    return 0;
}

✅ *pp는 p → 즉, *pp == p
✅ **pp는 *p == a → 즉, **pp == a

 


 

📌 이중 포인터를 왜 쓸까?

이중 포인터는 포인터 자체를 변경하고 싶을 때 꼭 필요합니다. 대표적인 예는 함수에서 포인터를 수정하거나, 동적 메모리를 할당할 때입니다.

 

📍 예제 1: 함수에서 포인터 값 변경

void changePointer(int **pp) {
    static int temp = 999;
    *pp = &temp;
}

int main() {
    int a = 10;
    int *p = &a;

    printf("Before: %d\n", *p); // 10

    changePointer(&p);

    printf("After: %d\n", *p);  // 999

    return 0;
}

✅ 일반 포인터로는 p의 주소값 자체를 바꿀 수 없지만, 이중 포인터로는 가능합니다!

 

📍 예제 2: 동적 메모리 할당

#include <stdlib.h>

void allocateMemory(int **pp) {
    *pp = (int *)malloc(sizeof(int));
    **pp = 123;
}

int main() {
    int *p = NULL;

    allocateMemory(&p);

    printf("할당된 값: %d\n", *p); // 123

    free(p); // 메모리 해제

    return 0;
}

✅ 함수 안에서 malloc으로 할당한 메모리를 함수 밖에서 사용하기 위해, 이중 포인터로 넘겨야 해요.

 


 

📌 이중 포인터 vs 다차원 배열

헷갈리는 개념 중 하나!
이중 포인터와 2차원 배열은 겉보기에 비슷하지만 메모리 구조가 다릅니다.

int matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

이 배열은 메모리 상에 연속적으로 저장되며, 포인터로 표현하면 int (*p)[3] 같은 식으로 선언합니다.

하지만 int **p는 2차원 배열처럼 동작해도, 각 행이 동적 포인터로 따로 할당된 경우에 해당합니다.

int **p = malloc(2 * sizeof(int*));
for (int i = 0; i < 2; i++) {
    p[i] = malloc(3 * sizeof(int));
}

✅ 즉, int **p는 "2차원 배열을 흉내낸 동적 구조"입니다.

 


📌 정리

이중 포인터는 다음과 같은 상황에서 매우 유용합니다

  • 함수 내에서 포인터를 수정하고자 할 때
  • 동적 메모리 할당된 포인터를 반환하고자 할 때
  • 포인터 배열, 2차원 배열 등을 효율적으로 다룰 때

 

 

처음에는 어렵지만 *, **, & 연산자를 직접 손으로 써보며 연습하면 감이 잡힙니다. 구조를 그림으로 그려보는 것도 많은 도움이 됩니다.

 

👀 C언어 관련 포스팅을 더 보고 싶다면 아래의 포스팅을 추천드려요

 

[C언어] 포인터(Pointer) - 정보처리기사 실기 준비

정보처리기사 실기 준비하면서 C언어의 개념을 간단하게 잡기 위해 공부하고 있는데요. 자료구조나 연산자 등은 자바와 비슷한 맥락이기 때문에 저는 바로 포인터 개념부터 시작했습니다.C언어

dev-yeonwha.tistory.com