하나는, 포인터 자신이고, 다른 하나는 포인팅 되는 오브젝트 이다.
그럼 포인터에 const키워드를 붙이면 어느 것이 상수화 될까?
답은 const키
워드를 붙이는 위치에 따라서 결정되는 것이다.
기준은 * 이다.
*앞에 const키워드를 붙이면(prefixing) 포인팅 되는 오브젝트가 상수화 되는 것이고,
* 뒤에 const키워드를 붙이면(postfixing) 포인터가 상수화 되는 것이다.
예를 들어보도록 한다.
void f1(char* p){
char s[] = "Gorm";
const char* pc = s; //pointer to constant
pc[3] = 'g'; // error: pc points to constant
pc = p; //ok
char *const cp = s; // constant pointer
cp[3] = 'a'; //ok
cp = p; //error: cp is constant
const char *const cpc = s; // const pointer to const
cpc[3] = 'a'; //error: cpc points to constant
cpc = p; //error: cpc is constant
}
코드를 잘 보면 이해가 갈 것이다.
그렇다면 문제!! 아래의 코드를 어떻게 되겠는가?
char *const cp;
char const* pc;
const char* pc2;
이미 답은 제시 했지만.... 첫번째 줄의 코드와 두번째 줄의 코드를 구분 할 수 있는가 하는 문제이다.
포인터를 상수화 할지, 포인팅되는 오브젝트를 상수화 할지는 *를 기준으로 const의 위치에 의해 결정된다과
했으므로, 두번째 줄의 코드는 상수를 가르키는 포인터이다.
다음의 코드는 컴파일 타임에 에러가 난다.
에러가 나는 원인이 무엇인지 한번 찾아 보라
void f4(){
int a = 1;
const int c = 2;
const int* p1 = &c;
const int* p2 = &a;
int* p3 = &c;
*p3 = 7;
}
답은 댓글로 달아 주는 센스~~
[참고 자료 : The C++ programming language 3rd, BJARNE STROUSTRUP ]