포인터는 다른 객체의 주소, 또는 주소가 없음을 저장한다. 주소가 없음은 `nullptr`로 나타낸다. `NULL`이나 `0`은 정수와 섞이므로 새 코드에서 쓰지 않는다.

C++ 8. 포인터는 주소다의 핵심 흐름도
그림. 포인터는 주소이며 대상 객체의 수명 안에서만 유효하다.

주소와 역참조

int value = 10;
int* p = &value;
*p = 12;          // value가 12가 된다
int* none = nullptr;
if (p != nullptr) {
    *p += 1;
}

`&`는 주소를 구하고, `*`는 그 주소의 객체를 가리킨다. 선언 `int* p`와 식의 `*p`는 같은 글자이고 하는 일이 다르다.

배열과 포인터

배열 이름은 많은 식에서 첫 원소의 포인터로 바뀐다. `p + 1`은 다음 원소의 주소다. 한 칸이 `sizeof(int)`만큼 떨어진다는 뜻이지, 바이트 1이 아니다. 범위를 벗어난 포인터 연산으로 만든 주소를 역참조하면 안 된다.

날 포인터는 소유를 표현하지 못한다. 누가 `delete`하는지 타입만 보고는 알 수 없다. 소유는 뒤의 스마트 포인터 편에서 타입으로 옮긴다. 그때까지 포인터는 빌려 보는 주소로만 쓴다.