기출문제/정보처리기사

2021년 3회 정보처리기사 기출문제 71번

엉클지니 2025. 3. 19. 10:53

71. 다음 C언어 프로그램이 실행되었을 때의 결과는?

0        4

 8         12

 


🔍 문제 분석

#include <stdio.h>
int main(void) {
    int n = 4;
    int* pt = NULL;
    pt = &n;

    printf("%d", &n + *pt - &pt + n);
    return 0;
}

이제 하나씩 해석해볼게.

🛠️ 코드 분석

  1. 변수 선언 및 초기화
    • n은 정수형 변수이며 4로 초기화됨.
    • pt는 정수형 포인터인데, 처음엔 NULL이지만 이후에 n의 주소를 가리키게 됨.
  2. int n = 4; int* pt = NULL;
  3. 포인터 할당
    • pt는 n의 주소를 저장함.
    • 즉, pt는 &n과 같은 값을 가짐.
  4. pt = &n;
  5. printf 계산식이 식을 차례대로 풀어볼게.이제 실제 연산을 진행해볼게.
  6. &n + *pt - &pt + n = &n + 4 - &pt + 4
  7. 1️⃣ &n: 변수 n의 주소
    2️⃣ *pt: pt가 가리키는 값, 즉 n의 값(4)
    3️⃣ &pt: 포인터 변수 pt의 주소
    4️⃣ n: 변수 n의 값, 즉 4
  8. printf("%d", &n + *pt - &pt + n);

🔬 주소값을 고려한 해석

  • 보통 변수는 메모리의 연속된 공간에 저장됨.
  • &n과 &pt는 각각 n과 pt의 메모리 주소를 의미.
  • 일반적으로 &pt는 &n보다 높은 주소에 위치.
  • 보통 &pt - &n은 1이므로, &n - &pt = -1이 됨.

🏆 최종 계산

&n + 4 - &pt + 4
= -1 + 4 + 4
= 8

즉, 프로그램 실행 결과는 8이 됨.


📌 결론

정답은 ③ 8!


🎯 추가 예시

비슷한 개념을 적용한 간단한 예제를 보면 이해가 쉬워질 거야.

예제 코드

#include <stdio.h>
int main() {
    int a = 10;
    int *p = &a;
    printf("%d", &a - &p + *p);
    return 0;
}

이 코드도 주소 값 차이를 계산해서 결과가 나오게 됨.


📚 정리

  1. 포인터의 기본 개념
    • *pt는 n의 값을 가리킴 (*pt = 4)
    • &n과 &pt는 각 변수의 메모리 주소를 나타냄.
  2. 주소 연산의 이해
    • &n - &pt 같은 연산은 주소 차이를 계산할 때 주의해야 함.
  3. 출력값 유도 과정
    • 주소 차이와 변수 값을 더하고 빼면서 결과를 계산.

 🚀

 

반응형