const 키워드는 두 가지 방식으로 포인터에 사용됩니다.
첫 번째는 포인터 자체를 일정하게 만드는 것이고 두 번째는 포인터가 상수 객체를 가리키도록 하는 것입니다.
상수 포인터
먼저 포인터 자체가 상수인 경우를 생각해보자.
int a = 30;
int b = 40;
int* const pt = &a;
pt = &b; //불가능
*pt = 40; //가능
이 경우 int(int*) 유형을 가리키는 포인터 pt 자체는 상수입니다.
즉, 다른 변수의 주소를 할당할 수 없습니다.
따라서 const가 아닌 값 자체를 대입할 수 있다.
상수 값에 대한 포인터
다음은 const 개체에 대한 포인터입니다.
int a = 30; //일반 변수
int b = 40;
const int* pt = &a; //pt는 const int형을 지시하는 포인터이다.
pt = &b; //가능
*pt = 40; //불가능
a =40; //가능
이 경우 위와 달리 ‘포인터가 가리키는 객체’는 변경할 수 있지만 ‘포인터가 가리키는 객체의 값’은 변경할 수 없습니다.
그러나 이것은 pt로 주어진 a가 실제로는 일정하지 않고 pt를 사용하는 한 일정하다는 것을 의미한다.
물론 변수가 일정하더라도 가리킬 수 있습니다.
const int a = 30; //const
const int* pt = &a; //가능
이 관계를 살펴보면 알 수 있듯이 const 개체를 단순 포인터로 참조하는 것은 불가능합니다.
const int a = 30; //const
int* pt = &a; //일반 포인터로 지시 불가능
const인 a의 값은 *pt(간접 참조)에 의해 변경될 수 있으므로 상식적으로라도 이를 방지하는 것이 맞다.
둘다.
즉, 상수를 가리키는 포인터를 상수로 정의하는 것도 가능하다.
const int a = 30; //const
const int* const pt = &a; //일반 포인터로 지시 불가능
매개변수 포인터 선언
포인터를 함수의 매개변수로 사용할 때 다음과 같은 이유로 const에 대한 포인터로 선언하는 것이 타당하다.
- 실수로 원본 데이터를 수정하는 것을 방지할 수 있습니다.
- const를 가리키는 포인터는 일반 객체와 const 객체를 모두 처리할 수 있지만 위에서 본 것처럼 일반 포인터는 const 객체를 처리할 수 없습니다.