이번 편의 목표: 변수의 주소와 그 주소에 들어 있는 값을 구분하고, 함수가 호출자의 변수를 바꾸게 합니다.

포인터는 주소입니다. &는 변수의 주소를 구하고, *는 그 주소에 있는 값을 읽거나 씁니다. 포인터 변수를 선언할 때도 *를 붙입니다.

C
#include <stdio.h>

void add_day(int *days) {
    if (days == NULL) {
        return;
    }
    *days = *days + 1;
}

int main(void) {
    int days = 3;
    int *pointer = &days;

    *pointer = 5;
    add_day(&days);
    printf("%d\n", days);
    return 0;
}

pointer는 days의 주소입니다. *pointer = 5는 days를 5로 바꿉니다. add_day(&days)는 그 주소를 받아 1을 더하므로 출력은 6입니다.

NULL은 어떤 객체도 가리키지 않는 포인터 값입니다. *를 NULL에 붙이면 동작이 정의되지 않으므로, 받기 전에 검사합니다. 주소가 아닌 값을 포인터에 넣지 않습니다. 07편에서 값이 복사되던 이유와 달리, 주소를 넘기면 함수가 원래 변수를 바꿀 수 있습니다.

직접 해 보기

add_day를 두 번 호출한 뒤 days를 출력하세요. 시작 값이 3이면 결과가 5여야 합니다.

해설

*pointer = 5로 5가 된 뒤 add_day가 두 번 실행되면 7이 아닙니다. 이 연습은 *pointer = 5 줄을 두지 않고 days가 3인 상태에서 add_day만 두 번 호출합니다. 3에 1을 두 번 더하면 5입니다.