#include <stdio.h>
// 1. Call by Value (값에 의한 호출)
// - 매개변수 a와 b는 main 함수의 x, y 값을 '복사'해서 새로 만든 변수입니다.
// - 여기서 지지고 볶아도 원본 x, y에는 전혀 영향을 주지 못합니다.
void swap_by_value(int a, int b) {
printf("\n [함수 내부: Call by Value]\n");
printf(" 매개변수 a의 주소: %p, 값: %d\n", (void*)&a, a);
printf(" 매개변수 b의 주소: %p, 값: %d\n", (void*)&b, b);
int temp = a;
a = b;
b = temp;
printf(" (교환 완료) a: %d, b: %d\n", a, b);
printf(" -> 함수 안에서는 바뀌었지만, 이 변수들은 곧 사라집니다.\n");
}
// 2. Call by Reference (참조에 의한 호출)
// - 매개변수 a와 b는 주소를 저장하는 '포인터'입니다.
// - 주소를 타고 가서(*a, *b) 값을 바꾸므로 원본 x, y가 직접 수정됩니다.
void swap_by_reference(int *a, int *b) {
printf("\n [함수 내부: Call by Reference]\n");
printf(" 포인터 a가 가리키는 주소: %p, 값: %d\n", (void*)a, *a);
printf(" 포인터 b가 가리키는 주소: %p, 값: %d\n", (void*)b, *b);
int temp = *a;
*a = *b;
*b = temp;
printf(" (교환 완료) *a: %d, *b: %d\n", *a, *b);
printf(" -> 원본 주소를 찾아가서 값을 바꿨으므로 밖에서도 바뀝니다.\n");
}
int main() {
int x = 10;
int y = 20;
printf("=== 초기 상태 ===\n");
printf("원본 x의 주소: %p, 값: %d\n", (void*)&x, x);
printf("원본 y의 주소: %p, 값: %d\n", (void*)&y, y);
// -------------------------------------------------------
printf("\n>>> 1. swap_by_value 호출 (값만 복사해서 보냄)");
swap_by_value(x, y);
printf("\n[Call by Value 결과 확인]\n");
printf("x: %d, y: %d", x, y);
if (x == 10 && y == 20) {
printf(" (실패! 원본은 그대로입니다.)\n");
} else {
printf(" (성공!)\n");
}
// -------------------------------------------------------
printf("\n>>> 2. swap_by_reference 호출 (주소를 보냄)");
swap_by_reference(&x, &y); // &를 붙여 주소를 전달
printf("\n[Call by Reference 결과 확인]\n");
printf("x: %d, y: %d", x, y);
if (x == 20 && y == 10) {
printf(" (성공! 원본이 바뀌었습니다.)\n");
} else {
printf(" (실패!)\n");
}
return 0;
}
To embed this project on your website, copy the following code and paste it into your website's HTML: