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
코드 하이라이팅 중...

단일 포인터 vs 이중 포인터
| 구분 | 단일 포인터 | 이중 포인터 |
|---|---|---|
| 선언 | int *ptr; | int **pptr; |
| 저장하는 것 | 변수의 주소 | 포인터의 주소 |
| 역참조 | *ptr (값) | *pptr (포인터), **pptr (값) |
c
코드 하이라이팅 중...
역참조 단계별 이해
역참조는 주소를 통해 값에 접근하는 것입니다. 이중 포인터에서는 *를 몇 번 사용하느냐에 따라 접근하는 대상이 달라집니다.
c
코드 하이라이팅 중...
| 표현 | 의미 | 결과 |
|---|---|---|
pptr | 이중 포인터 (ptr의 주소) | 0x2000 |
*pptr | pptr이 가리키는 포인터 (ptr) | 0x1000 |
**pptr | 최종 값 (num) | 10 |

`*pptr`은 `ptr`과 동일합니다
`*pptr`은 pptr이 가리키는 포인터, 즉 ptr 자체입니다. 따라서 `*pptr = 다른주소;`로 ptr이 가리키는 대상을 바꿀 수 있습니다.
구조체 배열에서 이중 포인터
구조체 배열과 이중 포인터를 함께 사용하는 패턴이 시험에 출제된 바 있습니다.
c
코드 하이라이팅 중...
배열 이름은 주소입니다.
ptr = a에서&를 붙이지 않는 이유입니다.

(*pptr)[i] 표현의 의미
(*pptr)[i]는 다음과 같이 해석됩니다.
*pptr: pptr이 가리키는 포인터 =ptr(*pptr)[i]:ptr[i]=a[i]
따라서 (*pptr)[i]는 배열의 i번째 요소에 접근합니다.
c
코드 하이라이팅 중...
이 코드는 a[2]의 값 {5, 6}을 a[1]에 복사합니다.
| 표현 | 동일한 표현 | 의미 |
|---|---|---|
*pptr | ptr | 배열 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 |
*arr | arr을 역참조 (= p = 배열의 시작 주소) | p |
*arr + i | 배열의 i번째 요소의 주소 | p + i |
*(*arr + i) | 배열의 i번째 요소의 값 | *(p + i), p[i], arr[i] |
결국 *(*arr + i) = 값;은 원본 배열의 i번째 요소를 수정합니다.

주의: 함수 내에서 arr[i]가 아닌 이유
함수 매개변수명이 arr이라도, 이것은 이중 포인터입니다.
c
코드 하이라이팅 중...
| 표현 | 의미 |
|---|---|
arr[i] | i번째 포인터 (int* 타입) |
*(*arr + i) | 배열의 i번째 값 (int 타입) |
함수 매개변수 이름에 속지 마세요
매개변수 이름이 arr이라도 `int **arr`은 이중 포인터입니다. 배열 요소에 접근하려면 `*(*arr + i)` 형태로 써야 합니다.