const가 포인터 변수 앞에 위치할 때

int num = 1;
const int* ptrNum = # // ptrNum의 가르치는 num값을 상수 (*ptrNum)을 상수화

// 다만 num은 상수화가 되는게 아니라 ptrNum을 통한 *ptrNum이 상수화 된다는 의미임.

*ptr = 2; // 컴파일에러 발생
num = 2; // num은 상수가 아니므로 성공

*ptr = 2;는 ptr이 가르키는 주소의 값을 const화 하는 개념이라 컴파일 에러가 발생한다.

하지만 num = 2; num은 상수화 되지 않은 변수니까 정상으로 컴파일된다.

const가 포인터 변수 뒤에 위치할 때

int num1 = 1;
int num2 = 2;
int* const ptrNum = &num1; // ptrNum이 가르키는 주소값을 상수화

ptrNum = &num2; // 컴파일 에러

// ptrNum이 가르키는 주소값을 상수화해서 고정했으므로 다른 주소로 변경할 수 없다.

ptrNum이 가르키는 포인터 주소를 고정시키는 것이기 때문에 다른 변수의 주소로 변경할 수 없다.

const가 포인터 변수 앞 뒤에 모두 존재할 때

위 설명의 모든 경우가 다 상수화 된다. 즉, 포인터 변수가 가르키는 주소도 변경할 수 없고, 해당 포인터로 값을 접근할 경우 (*ptrNum 같이) 에도 변경이 불가능하다.