카테고리 없음

[C언어] 포인터 배열이 가리키는 구조와 이를 이용한 간접 참조 방식의 사용 방법

codecodekode 2024. 10. 8. 07:00

다음 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}을 가리킵니다.

출력 부분

각 표현식을 하나씩 분석하겠습니다.

  1. parr[1][1]:
    • parr[1]은 arr[2]를 가리킵니다. 즉, {7, 8, 9}를 가리킵니다.
    • parr[1][1]은 arr[2][1]과 동일하며, 그 값은 8입니다.
  2. *(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입니다.
  3. **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]**의 값을 가리키게 됩니다.

정리

  1. parr[1] + 2**는 포인터 연산으로, parr[1]이 가리키는 배열에서 세 번째 요소(인덱스 2)를 가리키는 것을 의미하며, 이는 arr[2][2]와 동일합니다.
  2. parr**는 parr[0][0]**을 의미합니다. 이는 parr[0]**이 arr[1]**을 가리키기 때문이며, 따라서 parr**는 arr[1][0]**과 동일한 값을 가리킵니다.