포인터에 const가 붙으면 상당히 헷갈립니다. 이것들은 대체 무엇을 의미하는 것일까요?

 

 


 먼저 아래와 같이 선언된 것을 봅시다.

 

 이것은 p가 const char형을 가리키는 포인터임을 의미합니다. strcpy나, strcat 등의 인자가 이런 식으로 선언이 많이 되어 있음을 볼 수 있을 거에요.

 

 

 예를 들면 이런 식입니다. 이는 original data인, 원본 문자열이 변경되면 안 되기 때문이에요. 12번째 줄은, *(ori+1)을 변경하려고 시도하는데요. ori가 const char형을 가리키는 포인터입니다. 이는 변경 불가능한 Read Only data입니다. *(ori+1) 또한, Read Only이고, 이를 변경하려고 하기 때문에, 오류가 발생합니다.

 

 

 const char *pat은, pat이 가리키는 내용이 변경되지 않아야 할 때 넘깁니다. 예를 들어서, strcpy나 strcat의 원본 문자열 매개변수는 변경되면 곤란합니다. 따라서, 값을 바꾸지 못하게끔 상수화를 시키는 것입니다.

 

 

 당연하게도 ori+1을 char형 포인터로 강제 형변환을 하고 그것이 가리키는 공간에 't'를 넣으면 이 때에는 잘 들어갑니다. 왜냐하면, ori+1은 char형 포인터로 형변환이 되었기 때문입니다. 이 값을 p라 하면, (*p) = 't'의 의미는 p가 가리키는 공간에 't'를 넣으라는 의미가 됩니다.

 

 

 그러므로, 문자열을 출력했을 때, 2번째에 't'가 들어갑니다. 요약 정리하면, ori가 const char형을 가리키는 포인터라면, ori+1, ori+2 이런 것들도 const char형을 가리키는 pointer다. 그래서, *(ori+1) = 't' 이렇게 대입하면 안 된다. 정도만 기억하시면 좋겠습니다.

 

 


 그러면 이 경우는 어떨까요?

 

 

 p는 무엇인지 모르겠지만, 상수입니다. 그리고 그것이 char형을 가리키는 포인터라고 되어 있어요. 그러면 이것은 포인터 값인 p를 상수화 시켰다는 의미입니다. 즉, 상수 포인터라는 의미에요.

 

 

 p는 str의 시작 주소를 담고 있어요. 그런데 저는 p++;을 했어요. 이는 p의 값이 변한다는 거에요. 그런데, p가 상수화 되었는데 어떻게 변하나요? const로 선언한 변수는 변경될 수 없어요.

 

 

 따라서 이 경우는 에러입니다. 상수화된 값을 변경하려고 시도했기 때문입니다.

 

 


 그러면 이런 것은 어떻게 해석해야 할까요?

 

 const char * const p; 보기만 해도 구역질이 나는 선언인데요. p에 가까운 순서대로 보면 됩니다. const, char *, const 순서입니다. 그러면, p는 상수인데, 그것이 const char형 포인터라고 해석하시면 됩니다. 즉, p가 가리키는 내용도 바꿀 수 없고, p의 값 자체도 바꿀 수 없습니다.