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

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

*(역참조, 주소를 따라가서 그 위치의 값을 읽는 것)를 만나면 해당 주소로 찾아가서 값을 읽습니다. 임의 주소를 활용하면 이 과정을 구체적으로 추적할 수 있습니다.
| 표현 | parr 값 확인 | 역참조 | 결과 |
|---|---|---|---|
*parr[0] | parr[0] = 주소 100 | 주소 100의 값 = 10 | 10 |
*parr[1] | parr[1] = 주소 101 | 주소 101의 값 = 20 | 20 |
*parr[2] | parr[2] = 주소 102 | 주소 102의 값 = 30 | 30 |
응용 예시: 배열을 가리키는 포인터 배열
포인터 배열은 여러 배열의 시작 주소를 저장할 수도 있습니다.


임의 주소로 접근 과정을 살펴보면:
| 표현 | parr 값 확인 | 의미 | 결과 |
|---|---|---|---|
*parr[0] | parr[0] = 주소 100 | arr1[0] | 10 |
*(parr[0]+1) | 주소 100 + 1 = 주소 101 | arr1[1] | 20 |
*parr[1] | parr[1] = 주소 200 | arr2[0] | 40 |
*parr[2] | parr[2] = 주소 300 | arr3[0] | 60 |
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]과 같습니다. C언어에서 배열 이름을 쓰면 자동으로 첫 번째 요소의 주소로 변환되는데, 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 표현 | 주소 계산 | 대상 | 값 |
|---|---|---|---|
parr[0][0] | parr[0]=주소 200, +0 → 주소 200 | arr[1][0] | 4 |
parr[0][1] | parr[0]=주소 200, +1 → 주소 201 | arr[1][1] | 5 |
parr[1][0] | parr[1]=주소 300, +0 → 주소 300 | arr[2][0] | 7 |
parr[1][1] | parr[1]=주소 300, +1 → 주소 301 | 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] | 주소 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]와 같은 위치를 읽는 것입니다. 이를 적용하면:
**parr의 의미
**parr은 이중 역참조입니다. 먼저 *parr로 주소를 따라가면 parr[0]을 얻는데, 이 값도 주소(200)입니다. 여기에 다시 *를 붙여야 비로소 실제 정수 값을 얻습니다.
&(주소 구하기)와 *(주소 따라가기)는 서로 반대 연산이라서, *(&x)는 항상 x와 같습니다. 이 규칙을 적용하면:
문제 풀이 예시 심화
단계별 분석:
-
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: 배열 표기법 (빠른 풀이)
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
-
최종 결과: 8 + 9 + 4 = 21