/* 함수 — 값이 복사되어 넘어간다는 것
   컴파일:  gcc c-function.c -o fn -Wall                 */

#include <stdio.h>

/* 프로토타입 — main 아래에 정의한 함수를 미리 알려 둡니다 */
int  더하기(int a, int b);
void 인사(const char 이름[]);
void 못바꿈(int x);
void 바꿈(int *p);
void 두배로(int 값[], int 개수);
void 나누기(int a, int b, int *몫, int *나머지);

int main(void)
{
    printf("3 + 4 = %d\n", 더하기(3, 4));
    printf("두 배: %d\n", 더하기(3, 4) * 2);
    인사("김서연");

    /* ── 값은 복사되어 넘어갑니다 ── */
    int 수 = 10;
    못바꿈(수);
    printf("못바꿈 뒤: %d\n", 수);      /* 10 — 그대로입니다 */

    바꿈(&수);                            /* 주소를 넘깁니다 */
    printf("바꿈 뒤:   %d\n", 수);      /* 99 — 바뀌었습니다 */

    /* ── 배열은 주소가 넘어가서 원본이 바뀝니다 ── */
    int 값들[3] = {1, 2, 3};
    두배로(값들, 3);
    printf("배열: %d %d %d\n", 값들[0], 값들[1], 값들[2]);   /* 2 4 6 */

    /* 값을 두 개 돌려받기 — 담을 자리의 주소를 넘깁니다 */
    int 몫 = 0, 나머지 = 0;
    나누기(17, 5, &몫, &나머지);
    printf("17 / 5 = %d ... %d\n", 몫, 나머지);

    return 0;
}

int 더하기(int a, int b)
{
    return a + b;               /* return 을 만나면 함수는 여기서 끝납니다 */
}

void 인사(const char 이름[])     /* 돌려줄 것이 없으면 void */
{
    printf("안녕하세요, %s님\n", 이름);
}

void 못바꿈(int x)
{
    x = 99;                                     /* 복사본만 바뀝니다 */
    printf("  (함수 안에서 본 값: %d)\n", x);   /* 여기서는 99 로 보입니다 */
}

void 바꿈(int *p)
{
    *p = 99;                    /* 주소가 가리키는 자리를 고칩니다 */
}

void 두배로(int 값[], int 개수)
{
    for (int i = 0; i < 개수; i++) {
        값[i] *= 2;             /* 배열은 주소가 넘어와서 원본이 바뀝니다 */
    }
}

void 나누기(int a, int b, int *몫, int *나머지)
{
    if (b == 0) {
        *몫 = 0; *나머지 = 0;
        return;
    }
    *몫 = a / b;
    *나머지 = a % b;
}
