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

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

요약

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
코드 하이라이팅 중...
포인터 배열 기본 예시
포인터 배열의 각 요소는 다른 변수의 주소를 저장합니다.

아래 다이어그램에서는 임의의 주소값을 지정해서 포인터가 어떤 주소를 저장하고, 그 주소에 어떤 값이 있는지 구체적으로 보여줍니다.

포인터 배열 기본 예시 - 임의 주소
파란색 숫자는 임의로 정한 주소값입니다. parr의 각 요소는 변수의 주소를 저장하고, 그 주소를 따라가면 값을 읽을 수 있습니다.
c
코드 하이라이팅 중...

*(역참조, 주소를 따라가서 그 위치의 값을 읽는 것)를 만나면 해당 주소로 찾아가서 값을 읽습니다. 임의 주소를 활용하면 이 과정을 구체적으로 추적할 수 있습니다.

표현parr 값 확인역참조결과
*parr[0]parr[0] = 주소 100주소 100의 값 = 1010
*parr[1]parr[1] = 주소 101주소 101의 값 = 2020
*parr[2]parr[2] = 주소 102주소 102의 값 = 3030

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

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

c
코드 하이라이팅 중...
포인터 배열 응용 예시
포인터 배열로 서로 다른 크기의 배열들을 가리킬 수 있습니다.
포인터 배열 응용 예시 - 임의 주소
parr[0]은 arr1의 시작 주소(100)를, parr[1]은 arr2의 시작 주소(200)를, parr[2]은 arr3의 시작 주소(300)를 저장합니다.

임의 주소로 접근 과정을 살펴보면:

표현parr 값 확인의미결과
*parr[0]parr[0] = 주소 100arr1[0]10
*(parr[0]+1)주소 100 + 1 = 주소 101arr1[1]20
*parr[1]parr[1] = 주소 200arr2[0]40
*parr[2]parr[2] = 주소 300arr3[0]60

2차원 배열과 포인터 배열 기초

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


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

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

c
코드 하이라이팅 중...
포인터 배열과 2차원 배열
parr[0]은 arr[1]을, parr[1]은 arr[2]를 가리킵니다.
포인터 배열과 2차원 배열 - 임의 주소
parr[0]에는 주소 200(arr[1]의 시작)이, parr[1]에는 주소 300(arr[2]의 시작)이 저장됩니다.

이 코드에서:

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

여기서 arr[1]&arr[1][0]과 같습니다. C언어에서 배열 이름을 쓰면 자동으로 첫 번째 요소의 주소로 변환되는데, 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]과 같습니다. 주황색 행이 포인터 배열로 접근 가능한 부분이에요.
포인터 배열을 통한 2차원 배열 접근 - 임의 주소
parr[0][1]은 주소 200에서 1칸 이동한 주소 201의 값(5)을 가져옵니다.
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 표현주소 계산대상
parr[0][0]parr[0]=주소 200, +0 → 주소 200arr[1][0]4
parr[0][1]parr[0]=주소 200, +1 → 주소 201arr[1][1]5
parr[1][0]parr[1]=주소 300, +0 → 주소 300arr[2][0]7
parr[1][1]parr[1]=주소 300, +1 → 주소 301arr[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]주소 300-
parr[1] + 1주소 301-
parr[1] + 2주소 302-
*(parr[1] + 1)주소 301의 값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)와 완전히 같습니다. a가 시작 주소이고, a + i는 거기서 i칸 이동한 주소이고, *(a + i)는 그 주소의 값이니까 결국 a[i]와 같은 위치를 읽는 것입니다. 이를 적용하면:

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

**parr의 의미

**parr은 이중 역참조입니다. 먼저 *parr로 주소를 따라가면 parr[0]을 얻는데, 이 값도 주소(200)입니다. 여기에 다시 *를 붙여야 비로소 실제 정수 값을 얻습니다.

&(주소 구하기)와 *(주소 따라가기)는 서로 반대 연산이라서, *(&x)는 항상 x와 같습니다. 이 규칙을 적용하면:

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: 배열 표기법 (빠른 풀이)

    a[i] = *(a + i) 규칙을 적용하면 포인터 표기를 배열 표기로 바꿀 수 있습니다.

    • 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

    방법 3: 임의 주소 풀이

    • parr[1][1]
      • parr[1]에 저장된 주소 = 300
      • 주소 300에서 1칸 이동 → 주소 301
      • 주소 301의 값 = 8
    • *(parr[1]+2)
      • parr[1]에 저장된 주소 = 300
      • 주소 300에서 2칸 이동 → 주소 302
      • 주소 302의 값 = 9
    • **parr
      • *parr = parr[0], parr[0]에 저장된 주소 = 200
      • 주소 200의 값 = 4
  4. 최종 결과: 8 + 9 + 4 = 21


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

관련 글

(34개)
제목태그시험
C언어 구조체 배열
C언어
-
C언어 구조체 포인터
C언어
-
C언어 함수 프로토타입
C언어
-