C언어 포인터 배열과 2차원 배열

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

요약

C언어 포인터 배열의 개념과 2차원 배열과의 관계를 알아봅니다. int* parr[2] 선언의 의미와 2차원 배열 행을 가리키는 방법을 정보처리기사 실기 대비 핵심 내용으로 정리합니다.

포인터 배열 핵심 정리

개념설명예시
포인터 배열포인터를 요소로 가지는 배열int *parr[3];
2차원 배열의 행각 행은 1차원 배열, 행 이름은 주소arr[0], arr[1]
포인터 배열 초기화2차원 배열의 행 주소로 초기화parr[0] = arr[1];

포인터 배열이란?

포인터 배열포인터요소로 가지는 배열입니다. 배열의 각 요소가 주소를 저장합니다.

일반 배열포인터 배열
int arr[3]int *parr[3]
정수 3개 저장정수 포인터 3개 저장
arr[0] = 값parr[0] = 주소

기본 예시: 변수를 가리키는 포인터 배열

c
코드 하이라이팅 중...
포인터 배열 기본 예시
포인터 배열의 각 요소는 다른 변수의 주소를 저장합니다.
c
코드 하이라이팅 중...

응용 예시: 배열을 가리키는 포인터 배열

포인터 배열은 여러 배열의 시작 주소를 저장할 수도 있습니다.

c
코드 하이라이팅 중...
포인터 배열 응용 예시
포인터 배열로 서로 다른 크기의 배열들을 가리킬 수 있습니다.

2차원 배열과 포인터 배열

포인터 배열로 2차원 배열의 행에 접근할 수 있습니다. 2차원 배열의 각 행 이름(arr[0], arr[1] 등)은 해당 행의 시작 주소이므로, 포인터 배열에 저장할 수 있습니다.



포인터 배열로 2차원 배열 가리키기

포인터 배열의 각 요소에 2차원 배열의 행 주소를 저장할 수 있습니다.

c
코드 하이라이팅 중...
포인터 배열과 2차원 배열
parr[0]은 arr[1]을, parr[1]은 arr[2]를 가리킵니다.

이 코드에서:

  • parr[0]arr[1]을 저장 (4, 5, 6이 있는 행의 시작 주소)
  • parr[1]arr[2]를 저장 (7, 8, 9이 있는 행의 시작 주소)

여기서 arr[1]&arr[1][0]과 같습니다. 배열 이름이 첫 번째 요소의 주소인 것처럼, 2차원 배열의 행 이름도 해당 행의 첫 번째 요소 주소입니다.

행 이름동일한 표현의미
arr[1]&arr[1][0]1행의 첫 번째 요소 주소
arr[2]&arr[2][0]2행의 첫 번째 요소 주소

포인터 배열을 통한 접근

포인터 배열을 통해 2차원 배열의 요소에 접근하는 방법입니다.

c
코드 하이라이팅 중...
포인터 배열을 통한 2차원 배열 접근
parr[0]은 arr[1]을 가리키므로, parr[0][0]은 arr[1][0]과 같습니다. 주황색 행이 포인터 배열로 접근 가능한 부분이에요.
parr 표현동일한 표현
parr[0][0]arr[1][0]4
parr[0][1]arr[1][1]5
parr[1][0]arr[2][0]7
parr[1][1]arr[2][1]8

빠른 풀이법: 배열 치환

parr[i]가 어떤 행을 가리키는지 알면, parr[i]를 해당 행으로 치환해서 바로 값을 구할 수 있습니다.

c
코드 하이라이팅 중...
단계설명
1. 초기화 확인parr[1] = arr[2]
2. 치환parr[1][1]arr[2][1]
3. 값 읽기arr[2][1] = 8

포인터 표기법과 배열 표기법

포인터와 배열은 서로 바꿔 쓸 수 있습니다.

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

포인터 + 정수 = 주소 이동

parr[1] + 1주소를 1칸 옮긴 것입니다. &arr[2][0]에서 &arr[2][1]로 이동한다고 생각하면 됩니다.

표현주소로 표현
parr[1]&arr[2][0]-
parr[1] + 1&arr[2][1]-
parr[1] + 2&arr[2][2]-
*(parr[1] + 1)arr[2][1]8

주소에 *를 붙이면 그 주소의 값을 가져옵니다.

배열 표기법 → 포인터 표기법 변환

배열 표기법포인터 표기법주소로 이해하기
parr[1][0]*(parr[1] + 0)&arr[2][0]의 값 = 7
parr[1][1]*(parr[1] + 1)&arr[2][1]의 값 = 8
parr[1][2]*(parr[1] + 2)&arr[2][2]의 값 = 9

parr[1][1]과 *(parr[1] + 1)이 같은 이유

C언어에서 배열 접근 a[i]*(a + i)와 완전히 같습니다. 이를 적용하면:

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

**parr의 의미

**parr은 이중 역참조입니다.

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

문제 풀이 예시

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

단계별 분석:

  1. 2차원 배열 초기화

    • arr[0] = {1, 2, 3}
    • arr[1] = {4, 5, 6}
    • arr[2] = {7, 8, 9}
  2. 포인터 배열 초기화

    • parr[0] = arr[1] = &arr[1][0] (4, 5, 6의 시작 주소)
    • parr[1] = arr[2] = &arr[2][0] (7, 8, 9의 시작 주소)
  3. 각 표현 계산 - 아래 두 방법 중 편한 방법으로 풀면 됩니다.

    방법 1: 배열 표기법 (빠른 풀이)

    • parr[1][1]parr[1]arr[2]로 치환 → arr[2][1] = 8
    • *(parr[1]+2) = parr[1][2]arr[2][2] = 9
    • **parr = parr[0][0]arr[1][0] = 4

    방법 2: 주소 표기법 (원리 이해)

    • parr[1][1]
      • = *(parr[1] + 1) (배열 표기법 → 포인터 표기법)
      • = *(&arr[2][0] + 1) (parr[1] = &arr[2][0])
      • = *(&arr[2][1]) = arr[2][1] = 8
    • *(parr[1]+2)
      • = *(&arr[2][0] + 2) (parr[1] = &arr[2][0])
      • = *(&arr[2][2]) = arr[2][2] = 9
    • **parr
      • = *(parr[0]) (*parr = parr[0])
      • = *(arr[1]) (parr[0] = arr[1])
      • = *(&arr[1][0]) = arr[1][0] = 4
  4. 최종 결과: 8 + 9 + 4 = 21


포인터 배열 vs 배열 포인터

혼동하기 쉬운 두 개념을 비교합니다.

구분포인터 배열 int *p[3]배열 포인터 int (*p)[3]
p는 무엇?배열 (포인터 3개 담음)포인터 1개
가리키는 대상각각 int 변수 하나씩int 배열 전체
p + 1다음 포인터로 이동다음 배열로 이동 (12바이트)

포인터 배열 int *p[3]

포인터 3개를 담는 배열입니다.

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

배열 포인터 int (*p)[3]

크기 3인 배열 하나를 가리키는 포인터입니다.

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

쉽게 외우기

  • 포인터 배열: 포인터의 모음 (여러 개)
  • 배열 포인터: 배열을 가리키는 포인터 (하나)

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