← 목록으로

✏️ 4단계: 포인터로 값 바꾸기

포인터로 “그 방”의 값을 바꿀 수 있어요

포인터 p가 변수 a를 가리키고 있을 때, *p = 100;이라고 쓰면 p가 가리키는 곳(a가 있는 방)에 100을 넣는 거예요. 그래서 a의 값이 100으로 바뀌어요!

우편함 비유로 말하면, “103호 우편함에 새 편지를 넣는다”와 같아요. 103호(주소)를 알고 있으니까 그 안의 내용(값)을 바꿀 수 있는 거죠.

코드로 확인하기

[실행]으로 바로 결과를 볼 수 있어요.

실행하면 “바꾸기 전 a: 10”, “바꾼 후 a: 100”처럼 나와요. a = 100;이라고 직접 쓰지 않았는데도 a가 바뀌는 이유는, *p가 “a가 있는 그 방”을 가리키기 때문이에요.

왜 이게 유용할까요?

나중에 함수를 배우면, “함수 안에서 다른 변수의 값을 바꾸고 싶을 때” 포인터를 쓰게 돼요. 지금은 “포인터를 통하면 그 주소에 있는 값을 읽고 쓸 수 있다”만 기억하면 돼요.

✅ 4단계 정리

📋 실습 과제

과제 1 *p = *p + 5;를 사용해서 a의 값을 5만큼 늘려 보세요. 바꾼 뒤 a를 출력하면 105가 나와야 해요.

✏️ 여기서 직접 실습해 보세요

모바일에서도 이 창에서 수정·포맷·실행·복사할 수 있어요. [실행]으로 바로 결과를 볼 수 있습니다.

참고 정답 코드 (클릭하여 펼치기)
#include <stdio.h>

int main() {
    int a = 10;
    int *p = &a;
    *p = 100;
    *p = *p + 5;
    printf("a: %d\n", a);   /* 105 */
    return 0;
}
과제 2 (스왑) 두 변수 x, y의 값을 포인터만 사용해서 서로 바꾸는 프로그램을 작성하세요. (임시 변수 없이 *p, *q와 하나의 임시 변수만 사용해도 됩니다.)

여기서 직접 작성·실행해 보세요. [실행]으로 결과를 확인할 수 있어요.

과제 2 참고 정답 코드 (클릭하여 펼치기)
#include <stdio.h>

int main() {
    int x = 5, y = 10;
    int *p = &x, *q = &y;
    int temp = *p;
    *p = *q;
    *q = temp;
    printf("x=%d, y=%d\n", x, y);   /* x=10, y=5 */
    return 0;
}

🔬 심화 학습

함수로 두 변수 스왑하기 (call by pointer)

함수에 “값”을 넘기면 복사만 되므로 함수 안에서 바꿔도 원래 변수는 안 바뀌어요. “주소”를 넘기면 함수 안에서 그 주소의 값을 바꿀 수 있어요.

심화 참고 코드 (클릭하여 펼치기)
#include <stdio.h>

void swap(int *p, int *q) {
    int temp = *p;
    *p = *q;
    *q = temp;
}

int main() {
    int x = 5, y = 10;
    printf("전: x=%d, y=%d\n", x, y);
    swap(&x, &y);
    printf("후: x=%d, y=%d\n", x, y);
    return 0;
}

swap(&x, &y)처럼 주소를 넘기면, 함수 안의 *p, *q가 실제 x, y가 있는 “방”을 가리키므로 값이 바뀌어요.