정처기 감자정처기 감자
C언어포인터

검색

검색어를 입력해 개념, 문제, 필기를 찾습니다.

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

코딩C언어
읽는데 7분 소요
처음 쓰인 날: 2026-02-03
마지막 수정일: 2026-03-21
조회수: —
선수학습(1개)
  • C언어 포인터의 기초

요약

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

이중 포인터 핵심 정리

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

이중 포인터란?

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

c
코드 하이라이팅 중…
이중 포인터 개념
이중 포인터 pptr은 포인터 ptr의 주소를 저장합니다. pptr -> ptr -> num 순서로 연결됩니다.
이중 포인터 개념 - 임의 주소
시험에서는 주소를 단순한 숫자로 적어서 풀어봅니다. pptr(주소 2000)에 1000이 저장되어 ptr을 가리키고, ptr(주소 1000)에 100이 저장되어 num을 가리킵니다.

단일 포인터 vs 이중 포인터

구분단일 포인터이중 포인터
선언int *ptr;int **pptr;
저장하는 것변수의 주소포인터의 주소
역참조*ptr (값)*pptr (포인터), **pptr (값)
c
코드 하이라이팅 중…
선언과 역참조에서 `*`의 의미가 다릅니다
int 뒤의 별 두 개는 이중 포인터 타입을 뜻하고, 변수(pptr) 앞의 별 두 개는 두 번 역참조하라는 연산자입니다. 모양은 같지만 역할이 다르니 헷갈리지 마세요.

역참조 단계별 이해

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

c
코드 하이라이팅 중…
이중 포인터 역참조
*를 한 번 쓰면 ptr에 접근하고, 두 번 쓰면 최종 값 num에 접근합니다.
이중 포인터 역참조 과정 - 임의 주소
*pptr은 주소 1000으로 이동하여 ptr을 얻고, **pptr은 주소 100으로 이동하여 num의 값 10을 얻습니다.
표현의미결과
pptrpptr에 저장된 값 (= ptr의 주소)1000
*pptrptr에 저장된 값 (= num의 주소)100
**pptrnum의 값10
`*pptr`은 `ptr`과 동일합니다
`*pptr`은 pptr이 가리키는 포인터, 즉 ptr 자체입니다. 따라서 `*pptr = 다른주소;`로 ptr이 가리키는 대상을 바꿀 수 있습니다.

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

시험에서는 이중 포인터로 구조체 배열의 요소에 접근하거나 값을 복사하는 문제가 출제된 바 있습니다.

c
코드 하이라이팅 중…
배열 이름은 주소입니다
`ptr = a`에서 `&`를 붙이지 않는 이유입니다. 배열 이름과 주소를 참고하세요.
구조체 배열과 이중 포인터 - 임의 주소
pptr(주소 2000)은 ptr(주소 1000)을 가리키고, ptr은 구조체 배열 a(주소 100)를 가리킵니다.

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

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

  1. *pptr : pptr이 가리키는 포인터 = ptr
  2. (*pptr)[i] : ptr[i] = a[i] (ptr이 배열 a의 시작 주소를 저장하고 있으므로, ptr[i]로 배열 요소에 접근할 수 있습니다)

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

c
코드 하이라이팅 중…

이 코드는 a[2]의 값 {5, 6}을 a[1]에 복사합니다. 실행 후 배열 a는 {1, 2}, {5, 6}, {5, 6}이 됩니다.

주소를 넣어 (*pptr)[1]을 따라가 보겠습니다.

  • pptr의 값은 1000 → *pptr로 주소 1000에 접근하면 ptr
  • ptr의 값은 100 (= 배열 a의 시작 주소) → ptr[1]은 a[1]
  • 따라서 (*pptr)[1] = ptr[1] = a[1] = {3, 4}
표현동일한 표현의미
*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언어에서 함수에 값을 전달하면 복사본이 전달됩니다. 이중 포인터를 전달해도 마찬가지로 복사되지만, 복사된 값 안에 원본 포인터의 주소가 담겨 있으므로 그 주소를 따라가면 원본 배열을 수정할 수 있습니다.

c
코드 하이라이팅 중…

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

함수 매개변수 int **arr은 이중 포인터입니다.

함수 매개변수로 이중 포인터 전달 - 임의 주소
func의 매개변수 arr은 pp의 값(1000)을 복사받아, p를 통해 원본 배열에 접근합니다.

*(*arr + i) 표현을 단계별로 해석해보면 다음과 같습니다.

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

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

주의: 함수 내에서 arr[i]를 쓸 수 없는 이유

매개변수 이름이 arr이라서 arr[i]로 배열 요소에 접근할 수 있을 것 같지만, arr은 int ** 타입이므로 동작이 다릅니다.

arr[i]는 *(arr + i)와 같습니다. arr이 int **이므로 한 번 역참조한 결과는 int * 타입(포인터)이 됩니다. 우리가 원하는 int 타입(정수값)이 아닙니다.

표현타입의미
arr[i]int *arr 위치에서 i번째 포인터 (배열 값이 아님)
*(*arr + i)int배열의 i번째 값
매개변수 이름에 속지 마세요
이름이 arr이라도 `int **arr`은 이중 포인터입니다. 배열 요소에 접근하려면 `*(*arr + i)` 형태로 써야 합니다.

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

문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
메가커피와 함께, 홈페이지 개선에 참여하세요! ☕
혹시 이용에 불편한 점이나 개선이 필요한 부분을 발견하셨나요? 댓글로 알려주시면 더 나은 감자가 될 수 있어요! 🥔 제보해주신 모든 분께 메가커피 기프티콘을 드립니다! (본인 이메일로 댓글 달아주셔야해요~)

관련 글

(41개)
제목태그업데이트시험
C언어 형변환 (Casting)
C언어코딩C언어
2026-05-15-
C언어 연결 리스트 뒤집기 (Reverse Linked List)
C언어코딩C언어
2026-05-06-
C언어 사용자 정의 함수 기초
C언어코딩C언어
2026-05-06-
C언어41개
제목태그업데이트시험
C언어 형변환 (Casting)
C언어코딩C언어
2026-05-15-
C언어 연결 리스트 뒤집기 (Reverse Linked List)
C언어코딩C언어
2026-05-06-
C언어 사용자 정의 함수 기초
C언어코딩C언어
2026-05-06-
C언어 sizeof 연산자
C언어코딩C언어
2026-05-06-
C언어 이진 트리 (Binary Tree)
C언어코딩C언어
2026-04-24-
C언어 중첩 구조체와 포인터 접근
C언어코딩C언어
2026-04-24-
C언어 함수 포인터 (Function Pointer)
C언어코딩C언어
2026-04-24-
배열 C언어 코딩 감자시험
감자시험C언어배열감자시험
2026-03-28응시
C언어 왕감자 정보처리기사 실기 모의 시험
C언어C언어
2026-03-27응시
제어문/반복문 C언어 코딩 감자시험
감자시험C언어제어문반복문
2026-03-28응시
연산자 C언어 코딩 감자시험
감자시험C언어연산자감자시험
2026-03-28응시
포인터 C언어 코딩 감자시험
감자시험C언어포인터감자시험
2026-03-28응시
문자열 C언어 코딩 감자시험
감자시험C언어문자열감자시험
2026-03-28응시
구조체 C언어 코딩 감자시험
감자시험C언어구조체감자시험
2026-03-28응시
C언어 구조체 배열
C언어코딩C언어
2026-03-21-
C언어 구조체 포인터
C언어코딩C언어
2026-04-24-
C언어 함수 프로토타입
C언어코딩C언어
2026-03-21-
C언어 입력 함수 - scanf, getchar, gets
C언어코딩C언어
2026-03-21-
C언어 출력 함수 - putchar, printf, puts
C언어코딩C언어
2026-09-29-
C언어 문자열 포인터 (char *)
C언어코딩C언어
2026-03-21-
C언어 포인터 산술 (Pointer Arithmetic)
C언어코딩C언어
2026-03-21-
C언어 재귀함수 (Recursion)
C언어코딩C언어
2026-03-21-
C언어 선택정렬 (Selection Sort)
C언어코딩C언어
2026-02-10-
C언어 스택 (Stack) - LIFO 자료구조
C언어코딩C언어
2026-03-21-
C언어 2차원 배열
C언어코딩C언어
2026-03-21-
C언어 원형 큐 (Circular Queue)
C언어코딩C언어
2026-03-21-
C언어 ctype.h 문자 판별 함수
C언어코딩C언어
2026-03-21-
C언어 자료형
C언어코딩C언어
2026-05-15-
C언어 동적 메모리 할당 (malloc, free)
C언어코딩C언어
2026-05-04-
C언어 헤더 파일과 #include
C언어코딩C언어
2026-03-21-
C언어 연결 리스트 (Linked List)
C언어코딩C언어
2026-05-06-
C언어 포인터 배열과 2차원 배열
C언어코딩C언어
2026-03-24-
C언어 포인터의 기초
C언어코딩C언어
2026-06-25-
C언어 큐 (Queue) - FIFO 자료구조
C언어코딩C언어
2026-03-21-
C언어 static 변수 - 값이 유지되는 변수
C언어코딩C언어
2026-03-21-
C언어 포인터를 이용한 문자열 복사
C언어코딩C언어
2026-07-09-
C언어 문자열 뒤집기 (포인터 활용)
C언어코딩C언어
2026-03-21-
C언어 구조체
C언어코딩C언어
2026-03-20-
C언어 삼항 연산자
C언어코딩C언어
2026-03-21-
C언어 typedef - 자료형에 새 이름 붙이기
C언어코딩C언어
2026-03-21-
전설의 완전수 문제 - C언어
C언어코딩C언어
2025-09-12-
정처기 감자정처기 감자

정보처리기사 합격
도와줄라고 하는 감자

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매
© 2025 재현기획개발. All rights reserved.
  • 정처기 감자의 시작
  • 업데이트 로그
  • 개인정보 처리방침
  • 이용약관
상호명 : 재현기획개발 / 주소: 서울특별시 영등포구 영등포로 150, 지하1층 108호 L145 가라지(당산동1가, 생각공장 당산) / 대표: 김재현 / 전화: 010-8158-7127 / 통신판매업신고: 제2025-서울영등포-1569호 / 이메일: contact@edugamja.com / 사업자등록번호: 573-51-00999