다음 C언어로 구현된 프로그램을 분석하여 그 실행 결과를 쓰시오.
#include
int main() {
int arr[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int* parr[2] = {arr[1], arr[2]};
printf("%d", parr[1][1] + *(parr[1]+2) + **parr);
return 0;
}
코드 분석
1. 배열 정의 및 초기화
- arr는 3x3 배열로, 다음과 같이 초기화됩니다
- 각 요소는 다음과 같은 형태로 배열되어 있습니다:
- arr[0] = {1, 2, 3}
- arr[1] = {4, 5, 6}
- arr[2] = {7, 8, 9}
포인터 배열 정의
c
- parr는 int* 타입의 포인터 배열입니다. 이 배열은 arr[1]과 arr[2]를 가리킵니다.
- parr[0]은 arr[1]을 가리키므로, parr[0]은 {4, 5, 6}을 가리킵니다.
- parr[1]은 arr[2]를 가리키므로, parr[1]은 {7, 8, 9}을 가리킵니다.
출력 부분
각 표현식을 하나씩 분석하겠습니다.
- parr[1][1]:
- parr[1]은 arr[2]를 가리킵니다. 즉, {7, 8, 9}를 가리킵니다.
- parr[1][1]은 arr[2][1]과 동일하며, 그 값은 8입니다.
- *(parr[1] + 2)
- parr[1]은 arr[2]를 가리킵니다. arr[2]는 {7, 8, 9}입니다.
- parr[1] + 2는 arr[2]에서 두 번째 인덱스 후 위치를 가리킵니다. 즉, arr[2][2]를 가리키며, 그 값은 9입니다.
- 따라서 *(parr[1] + 2)는 9입니다.
- **parr:
- parr[0]은 arr[1]을 가리킵니다. 즉, {4, 5, 6}을 가리킵니다.
- **parr는 parr[0][0]을 의미하며, 이는 arr[1][0]과 동일합니다. 그 값은 4입니다.
최종 계산
- parr[1][1] + *(parr[1] + 2) + **parr의 값:
- parr[1][1] = 8
- *(parr[1] + 2) = 9
- **parr = 4
최종 실행 결과
따라서, 이 프로그램의 출력 결과는 21입니다.
1. parr[1] + 2는 arr[2]에서 두 번째 인덱스 후 위치를 가리킵니다. 즉, arr[2][2]를 가리키며, 그 값은 9입니다?
- parr[1]:
- parr는 int* 타입의 포인터 배열이고, parr[1]은 arr[2]를 가리킵니다. 즉, parr[1]은 {7, 8, 9}라는 값들을 가진 배열의 시작 주소를 가리키고 있습니다.
- parr[1] + 2:
- parr[1]은 배열의 시작 주소를 가리키므로, parr[1] + 2는 시작 주소에서 두 번째 인덱스(즉, 배열의 세 번째 요소)를 가리키는 주소가 됩니다.
- 구체적으로, parr[1] + 2는 arr[2][2]를 의미하며, 그 값은 9입니다.
- "두 번째 인덱스 후 위치"의 의미
- 인덱스 0: parr[1][0] = arr[2][0] = 7
- 인덱스 1: parr[1][1] = arr[2][1] = 8
- 인덱스 2: parr[1][2] = arr[2][2] = 9
- 따라서 parr[1] + 2는 배열에서 세 번째 요소인 9를 가리킵니다.
2. 왜 **parr는 parr[0][0]을 의미하는 걸까? 그리고 왜 이는 arr[1][0]과 동일할까?
- **parr의 의미:
- parr**는 int* 타입의 포인터 배열입니다.
- parr**는 배열 parr의 첫 번째 요소를 가리킵니다. 즉, parr[0]을 의미합니다. 여기서 parr[0]은 arr[1]을 가리킵니다.
- parr**는 *parr[0]과 동일한 의미이며, 결국 arr[1][0]을 가리킵니다.
- 왜 **parr이 arr[1][0]과 동일한가
- parr[0]은 arr[1]의 시작 주소를 가리킵니다. 따라서 *parr는 arr[1]의 시작 주소, 즉 arr[1][0]을 의미합니다.
- 결국 parr**는 parr 배열의 첫 번째 요소가 가리키는 값, 즉 arr[1][0]**의 값을 가리키게 됩니다.
정리
- parr[1] + 2**는 포인터 연산으로, parr[1]이 가리키는 배열에서 세 번째 요소(인덱스 2)를 가리키는 것을 의미하며, 이는 arr[2][2]와 동일합니다.
- parr**는 parr[0][0]**을 의미합니다. 이는 parr[0]**이 arr[1]**을 가리키기 때문이며, 따라서 parr**는 arr[1][0]**과 동일한 값을 가리킵니다.