C++에서 const는 값을 수정할 수 없도록 만드는 키워드이다.
하지만 포인터와 함께 쓰이면, 가리키는 대상이 상수인지, 자신(포인터 자체)이 상수인지, 혹은 둘 다인지에 따라 전혀 다른 의미가 된다.
const T* p
선언된 순서 그대로 const한 T를 가리키는 포인터 라고 생각하면 된다. 이 포인터가 가리키는 대상은 const이기 때문에, 해당 포인터로는 대상의 값을 변경할 수 없다.
int data1 = 10;
const int* p = &data1;
// *p = 20; // error! - 참조하는 공간의 값 변경(쓰기) 불가능
int data2 = 20;
p = &data2; // 참조 대상을 변경할 수 있음
// *p = 20; // error! - 여전히 이 포인터는 읽기 전용
T* const p
마찬가지로 선언된 순서 그대로 생각하면 된다. T를 가리키는 const 한 포인터이다. 포인터가 const하므로, 이 포인터의 값, 즉 주소를 변경할 수 없게 된다.
int* const p = &data1;
const int* const p = &data1;
포인터 역시 하나의 변수이므로, 그 주소를 다른 포인터로 저장할 수 있다. 포인터를 가리키는 포인터를 다중 포인터(Multiple Pointer), 또는 흔히 더블 포인터(Double Pointer) 라고 부른다.
포인터 지옥에 다시 발을 담궜다. 따땃하구만...
수상할 정도로 그림을 잘 그리는 프로그래머.