C언어 이중 포인터 (Double Pointer)

코딩C언어
읽는데 5분 소요
처음 쓰여진 날: 2026-02-03
마지막 수정일: 2026-02-03
조회수: 52

요약

C언어 이중 포인터의 개념과 역참조 방법을 알아봅니다. 포인터의 포인터가 무엇인지, (*pptr)[i] 표현이 어떻게 동작하는지 정보처리기사 실기 대비 핵심 내용을 정리합니다.

이중 포인터 핵심 정리

개념설명예시
이중 포인터포인터의 주소를 저장하는 포인터int **pptr;
*단일 역참조 (pptr)이중 포인터가 가리키는 포인터*pptr == ptr
**이중 역참조 (pptr)최종 값에 접근**pptr == *ptr == 값

이중 포인터란?

이중 포인터(Double Pointer)포인터의 주소를 저장하는 포인터입니다. 즉, "포인터를 가리키는 포인터"입니다.

c
코드 하이라이팅 중...
이중 포인터 개념
이중 포인터 pptr은 포인터 ptr의 주소를 저장합니다. pptr -> ptr -> num 순서로 연결됩니다.

단일 포인터 vs 이중 포인터

구분단일 포인터이중 포인터
선언int *ptr;int **pptr;
저장하는 것변수의 주소포인터의 주소
역참조*ptr (값)*pptr (포인터), **pptr (값)
c
코드 하이라이팅 중...


역참조 단계별 이해

역참조는 주소를 통해 값에 접근하는 것입니다. 이중 포인터에서는 *를 몇 번 사용하느냐에 따라 접근하는 대상이 달라집니다.

c
코드 하이라이팅 중...
표현의미결과
pptr이중 포인터 (ptr의 주소)0x2000
*pptrpptr이 가리키는 포인터 (ptr)0x1000
**pptr최종 값 (num)10
이중 포인터 역참조
*를 한 번 쓰면 ptr에 접근하고, 두 번 쓰면 최종 값 num에 접근합니다.

구조체 배열에서 이중 포인터

구조체 배열과 이중 포인터를 함께 사용하는 패턴이 시험에 출제된 바 있습니다.

c
코드 하이라이팅 중...

배열 이름은 주소입니다. ptr = a에서 &를 붙이지 않는 이유입니다.

구조체 배열과 이중 포인터
pptr은 ptr을 가리키고, ptr은 구조체 배열 a를 가리킵니다.

(*pptr)[i] 표현의 의미

(*pptr)[i]는 다음과 같이 해석됩니다.

  1. *pptr : pptr이 가리키는 포인터 = ptr
  2. (*pptr)[i] : ptr[i] = a[i]

따라서 (*pptr)[i]배열의 i번째 요소에 접근합니다.

c
코드 하이라이팅 중...

이 코드는 a[2]의 값 {5, 6}a[1]에 복사합니다.

표현동일한 표현의미
*pptrptr배열 a의 시작 주소
(*pptr)[0]ptr[0], a[0]첫 번째 구조체 {1, 2}
(*pptr)[1]ptr[1], a[1]두 번째 구조체 {3, 4}
(*pptr)[2]ptr[2], a[2]세 번째 구조체 {5, 6}

함수 매개변수로 이중 포인터 전달

이중 포인터를 함수의 매개변수로 전달하면, 함수 내에서 원본 배열의 값을 직접 수정할 수 있습니다.

c
코드 하이라이팅 중...

*(*arr + i) 표현 이해하기

함수 매개변수 int **arr은 이중 포인터입니다. *(*arr + i) 표현을 단계별로 해석해보면 다음과 같습니다.

표현의미동일한 표현
arr함수에 전달된 이중 포인터 (= pp = &p)&p
*arrarr을 역참조 (= p = 배열의 시작 주소)p
*arr + i배열의 i번째 요소의 주소p + i
*(*arr + i)배열의 i번째 요소의 값*(p + i), p[i], arr[i]

결국 *(*arr + i) = 값;원본 배열의 i번째 요소를 수정합니다.

함수 매개변수로 이중 포인터 전달
func 함수에서 *(*arr + i)로 원본 배열에 접근합니다. arr -> p -> 배열 순서로 연결됩니다.

주의: 함수 내에서 arr[i]가 아닌 이유

함수 매개변수명이 arr이라도, 이것은 이중 포인터입니다.

c
코드 하이라이팅 중...
표현의미
arr[i]i번째 포인터 (int* 타입)
*(*arr + i)배열의 i번째 값 (int 타입)

정보처리기사 실기 대비 문제