C언어 포인터 배열과 2차원 배열
요약
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] = 주소 |
기본 예시: 변수를 가리키는 포인터 배열

응용 예시: 배열을 가리키는 포인터 배열
포인터 배열은 여러 배열의 시작 주소를 저장할 수도 있습니다.

2차원 배열과 포인터 배열
포인터 배열로 2차원 배열의 행에 접근할 수 있습니다. 2차원 배열의 각 행 이름(arr[0], arr[1] 등)은 해당 행의 시작 주소이므로, 포인터 배열에 저장할 수 있습니다.
포인터 배열로 2차원 배열 가리키기
포인터 배열의 각 요소에 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차원 배열의 요소에 접근하는 방법입니다.

| 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]를 해당 행으로 치환해서 바로 값을 구할 수 있습니다.
| 단계 | 설명 |
|---|---|
| 1. 초기화 확인 | parr[1] = arr[2] |
| 2. 치환 | parr[1][1] → arr[2][1] |
| 3. 값 읽기 | arr[2][1] = 8 |
포인터 표기법과 배열 표기법
포인터와 배열은 서로 바꿔 쓸 수 있습니다.
포인터 + 정수 = 주소 이동
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)와 완전히 같습니다. 이를 적용하면:
**parr의 의미
**parr은 이중 역참조입니다.
문제 풀이 예시
단계별 분석:
-
2차원 배열 초기화
arr[0]={1, 2, 3}arr[1]={4, 5, 6}arr[2]={7, 8, 9}
-
포인터 배열 초기화
parr[0]=arr[1]=&arr[1][0](4, 5, 6의 시작 주소)parr[1]=arr[2]=&arr[2][0](7, 8, 9의 시작 주소)
-
각 표현 계산 - 아래 두 방법 중 편한 방법으로 풀면 됩니다.
방법 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
- =
-
최종 결과: 8 + 9 + 4 = 21
포인터 배열 vs 배열 포인터
혼동하기 쉬운 두 개념을 비교합니다.
| 구분 | 포인터 배열 int *p[3] | 배열 포인터 int (*p)[3] |
|---|---|---|
| p는 무엇? | 배열 (포인터 3개 담음) | 포인터 1개 |
| 가리키는 대상 | 각각 int 변수 하나씩 | int 배열 전체 |
p + 1 | 다음 포인터로 이동 | 다음 배열로 이동 (12바이트) |
포인터 배열 int *p[3]
포인터 3개를 담는 배열입니다.
배열 포인터 int (*p)[3]
크기 3인 배열 하나를 가리키는 포인터입니다.
쉽게 외우기
- 포인터 배열: 포인터들의 모음 (여러 개)
- 배열 포인터: 배열을 가리키는 포인터 (하나)