우리가 보통 포인터를 사용할때는 두가지가 관계가 있다.

하나는, 포인터 자신이고, 다른 하나는 포인팅 되는 오브젝트 이다.

그럼 포인터에 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 ]