포인터 p가 변수 a를 가리키고 있을 때, *p = 100;이라고 쓰면 p가 가리키는 곳(a가 있는 방)에 100을 넣는 거예요. 그래서 a의 값이 100으로 바뀌어요!
우편함 비유로 말하면, “103호 우편함에 새 편지를 넣는다”와 같아요. 103호(주소)를 알고 있으니까 그 안의 내용(값)을 바꿀 수 있는 거죠.
[실행]으로 바로 결과를 볼 수 있어요.
실행하면 “바꾸기 전 a: 10”, “바꾼 후 a: 100”처럼 나와요. a = 100;이라고 직접 쓰지 않았는데도 a가 바뀌는 이유는, *p가 “a가 있는 그 방”을 가리키기 때문이에요.
나중에 함수를 배우면, “함수 안에서 다른 변수의 값을 바꾸고 싶을 때” 포인터를 쓰게 돼요. 지금은 “포인터를 통하면 그 주소에 있는 값을 읽고 쓸 수 있다”만 기억하면 돼요.
*p = 값; → p가 가리키는 곳에 그 값을 넣어요.a의 값이 바뀌어요.*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;
}
x, y의 값을 포인터만 사용해서 서로 바꾸는 프로그램을 작성하세요. (임시 변수 없이 *p, *q와 하나의 임시 변수만 사용해도 됩니다.)
여기서 직접 작성·실행해 보세요. [실행]으로 결과를 확인할 수 있어요.
#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가 있는 “방”을 가리키므로 값이 바뀌어요.