#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;
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: