포인터 변수
를 정의할 때, const
를 최대 2개까지 포함할 수 있다. 그 이유는 포인터 변수
는 2개의 정보와 관련이 있기 때문이다.
포인터 변수
자체에 보관된 정보.포인터 변수
가 가리키는 변수에 보관된 정보.즉, 이 두 가지 정보에 대해서 const
여부를 설정할 수 있는 것이다.
int a = 10;
int b = 20;
const int *p = &a;
p = &b; // ok
*p = 30; // fail
맨 앞의 const
를 추가했다. 이렇게한 이유는 p
가 가리키는 변수는 const int
타입이다. 라는 의미가 된다. 따라서 p
가 가리키는 변수의 값을 바꾸는 것을 허용하지 않게 된다. p
가 가리키는 변수는 실제로 const
속성을 가졌는지는 중요하지 않다.
다만 이렇게 명시해줬기 때문에 컴퓨터는 p
가 가리키는 변수가 const int
타입이라고 생각하고 값의 변경을 막는 것이다.
int a = 10;
int b = 20;
int* const p = &a;
p = &b; // fail
*p = 30; // ok
이번에는 변수 이름 앞에 const
를 넣어줬다. 이것이 int
타입을 가리키는 p
는 const
속성을 갖는다. 라는 의미가 된다. 그래서 p
의 값을 바꾸는 행위는 용납되지 않는다.
반면에 p
자체는 const
지만 p
가 가리키는 변수는 const
가 아니므로 아무런 문제가 없다.
int a = 10;
int b = 20;
const int* const p = &a;
p = &b; // fail
*p = 30; // fail
이 경우는 포인터 p
뿐만 아니라 p
가 가리키는 변수까지도 const
라는 의미가 된다. 따라서 모두 오류가 발생한다.
const의 의미를 보는 방법
const
의 의미를 보는 방법은 쉽다.const
다음에 오는 것을 상수화 시켜버린다고 생각하면 된다.
const int *p
는const
다음에int *
가 오므로int *
타입의 값. 즉, 포인터가 가리키는 값이const
가 된다.
int* const p
의 경우에는const
다음에p
가 오므로p
자체가const
가 된다.