연습6(포인터 공부 더)

류한선·2025년 6월 26일

실기연습-2

목록 보기
46/95

좋아요! 🔥 이번에도 포인터 문제 한 번 꼼꼼하게 풀어보면서 이해를 확실히 해볼게요.


🎯 연습 문제: C언어 포인터 연산 집중 문제

#include <stdio.h>

int main() {
    int arr[4] = {5, 10, 15, 20};
    int *p = arr;     // p는 arr[0]을 가리킴
    int **pp = &p;    // pp는 p의 주소를 가리킴

    printf("%d ", *p);      // 출력1
    printf("%d ", *p++);    // 출력2
    printf("%d ", *p);      // 출력3
    printf("%d ", **pp);    // 출력4
    (*pp)++;                // p 한 칸 증가
    printf("%d\n", *p);     // 출력5

    return 0;
}

🧠 한 줄씩 디버깅

초기 상태

  • arr : [5, 10, 15, 20]
  • parr[0] (값 5)
  • ppp의 주소

출력1: *p

  • p가 가리키는 arr[0] 값 → 5 출력
  • p는 이동하지 않음

출력2: *p++

  • *p++ = *(p++) 이므로
  • p++ 하기 전 p가 가리키는 값 → 5 출력
  • p가 한 칸 증가 → parr[1] 가리킴

출력3: *p

  • p가 현재 arr[1]을 가리키므로 → 10 출력

출력4: **pp

  • ppp의 주소 → *pp = p
  • **pp = *p
  • parr[1] 가리키므로 → 10 출력

(*pp)++;

  • *ppp(*pp)++p++ 와 같음
  • 즉, p를 한 칸 증가시켜서 arr[2] 가리킴

출력5: *p

  • parr[2]를 가리키므로 → 15 출력

🎯 최종 출력값

5 5 10 10 15

✅ 요약

단계설명출력값p가 가리키는 위치
출력1*p (현재 arr[0])5arr[0] (5)
출력2*p++ (출력 후 p 증가)5arr[1] (10)
출력3*p10arr[1] (10)
출력4**pp = *p10arr[1] (10)
(*pp)++p 증가arr[2] (15)
출력5*p15arr[2] (15)

좋아요! 증감연산자(++, --) 특히 후위(postfix)와 전위(prefix)의 차이가 헷갈릴 때가 많죠.
이 부분은 C, Java, Python 등 거의 모든 언어에서 동일한 원칙이라 잘 이해해두면 실전에서 큰 도움이 됩니다.


🎯 증감연산자 정리: 전위 vs 후위

종류설명동작 순서예시 (x = 5)출력 값
전위(prefix) ++x변수 값을 먼저 증가시키고, 증가된 값을 반환증가 → 반환++x (x=6 됨)6
후위(postfix) x++변수 값을 먼저 반환하고, 그 다음에 증가반환 → 증가x++ (출력 5, 이후 x=6)5 (출력 후 증가)

예제 1: 전위/후위 차이

int x = 5;
printf("%d\n", ++x); // 전위: 먼저 증가, 출력 6
x = 5;
printf("%d\n", x++); // 후위: 먼저 출력 5, 나중에 증가
printf("%d\n", x);   // 증가된 값 출력 6

🧠 실전 느낌: 언제 헷갈릴까?

  • **후위 x++**는 출력(사용)할 때는 아직 증가 전 값이라 헷갈림
  • 하지만 이후 줄에서 값을 쓰면 증가된 상태가 반영됨
  • **전위 ++x**는 출력 순간부터 값이 증가한 상태임

예제 2: 증감연산자와 대입

int a = 3;
int b = a++;  // b=3, a=4
int c = ++a;  // a=5, c=5

증감연산자 활용 주의점

  • 여러 연산자가 섞인 표현식에선 결과가 예상과 다를 수 있으니
  • 한 줄에 여러 증감 연산자 쓰는 건 피하는 게 안전함
  • 디버깅 어려워짐

정리

상황출력되는 값 (x=5)
++x6 (증가 후 출력)
x++5 (출력 후 증가)
y = ++xx=6, y=6
y = x++y=5, x=6

알겠습니다! 후위 증감 연산자(x++) 때문에 헷갈릴 수 있는 복잡한 문제를 드릴게요.
포인터 없이 변수와 증감연산자만 섞여서 헷갈리기 딱 좋은 문제입니다.


🔥 연습 문제: 후위 증감 연산자 헷갈리기

#include <stdio.h>

int main() {
    int x = 3;
    int y = x++ + ++x + x++ + ++x;
    printf("x = %d, y = %d\n", x, y);
    return 0;
}

좋아요! 아주 헷갈리기 좋은 문제라 차근차근 한 줄 한 줄 설명해 드릴게요.


문제 코드 다시 보기

int x = 3;
int y = x++ + ++x + x++ + ++x;
printf("x = %d, y = %d\n", x, y);

Step 1: 변수 초기화

  • x = 3

Step 2: y = x++ + ++x + x++ + ++x; 계산

이 표현식에서 x가 계속 변하고, 후위/전위 증감 연산자가 섞여 있으니
가장 중요한 것은 왼쪽에서 오른쪽 순서로 차근차근 계산하는 것입니다.


Step 3: 각 항 계산 (왼쪽에서 오른쪽)

설명x 값 (평가 전)평가값 (항 결과)x 값 (평가 후)
x++후위 → 현재 값 사용 후 1 증가334
++x전위 → 먼저 1 증가 후 값 사용455
x++후위 → 현재 값 사용 후 1 증가556
++x전위 → 먼저 1 증가 후 값 사용677

Step 4: y 계산하기

  • y = 3 + 5 + 5 + 7 = 20

Step 5: 최종 변수 상태

  • x = 7 (마지막 ++x 후 증가 완료)

Step 6: 출력값

x = 7, y = 20

🧠 요약

  • 후위(x++)는 현재 값 사용 → 증가
  • 전위(++x)는 먼저 증가 → 값 사용
  • 식은 왼쪽에서 오른쪽으로 계산
  • 각 단계마다 변수 x 값을 업데이트하면서 계산해야 함

좋아요! 이번에는 Soojebimain까지 같이 있으니 후위 연산자(yyyy++)의 동작을 제대로 파헤쳐봅시다.
이 문제에서 많은 분들이 헷갈리는 부분은 바로 yyyy++언제 증가되고, 생성자에 어떤 값이 넘어가는가예요.


🧠 코드 다시 보기

int yyyy = 2020;
Car c = new Car("SUV", "흰색", yyyy++);  // 후위 증가
System.out.print(", year : " + c.yyyy);

🔍 한 줄 한 줄 트레이스하기

1️⃣ int yyyy = 2020;

  • 현재 yyyy = 2020

2️⃣ new Car("SUV", "흰색", yyyy++);

여기서 yyyy++의 동작을 주의깊게 보세요.

  • yyyy++후위 증가 연산자이므로:

    1. 현재 값 2020을 **리턴(사용)**한 후,
    2. yyyy1 증가시킵니다 → 호출 후 yyyy = 2021

즉, Car 생성자에게 2020을 넘깁니다.


3️⃣ Car(String model, String color, int yyyy) 생성자 내부:

  • this.model = "SUV"
  • this.color = "흰색"
  • this.yyyy = 2020 (넘겨받은 값 대입)
  • 출력: model : SUV

4️⃣ System.out.print(", year : " + c.yyyy);

  • c.yyyy에는 생성자 호출 시 받았던 2020이 저장되어 있음
  • 출력: , year : 2020

🎯 프로그램 출력값

model : SUV, year : 2020

main() 끝나고 yyyy

  • main() 안의 지역변수 yyyy는 이미 후위 증가되어 2021이지만,
    c.yyyy 필드에는 생성자 호출 때 전달된 2020이 남아 있어요.

📝 한 줄 요약

yyyy++ → "지금 값(2020) 넘기고, 넘긴 후 증가하기 때문에 생성자에게는 2020이 넘어간다."


0개의 댓글