C언어가 막강하지만, 초보자에게 높은 벽이 포인터입니다.

포인터가 무엇인가 이해하게 되었을 쯤 또 헷갈리게 하는 것이 있습니다.

바로 const와의 조합입니다.


아래 두 행의 차이점을 이해하시겠습니까?


const char *ptr;

char * const ptr;


갑자기 보게 되면 아리송해지는 질문입니다만, 포인터의 값을 구하는 방법을 이해하신다면

매우 쉬운 내용입니다.

우선 포인터 변수가 가르키는 값을 구할 때는 '*' 를 사용합니다.


즉, ptr 이 가지고 있는 값(주소)을 가져 올 때는 일반 변수를 사용하듯 변수 이름만 사용합니다.

ptr의 주소가 가르키는 위치의 값을 구할 때 '*' 를 앞에 붙이죠.


- 포인터 ptr의 값을 구할 때는 int addr = ptr;

- 포인터 ptr의 값을 주소로 하여 주소 값을 구할 때는 char ch = *ptr;


당연한 얘기를 좀 길게 했습니다. 자, 이제 const를 사용해 보죠.


const char *ptr 이라고 const를 앞에 붙이고 이후에 *ptr 이라고 적었습니다.

즉, *ptr의 값을 상수 처리하겠다는 것으로 *ptr 값이 변경되는 것을 막게 됩니다.


char * const ptr 이라고 하면? 눈치 채셨겠습니다만, ptr의 값을 상수값으로 

처리 하겠다는 뜻입니다.


이렇게 const를 사용하면 컴파일할 때 걸러 줍니다.


    const char *ptr;  또는 char const *ptr;


    ptr = &ch_data; 


    *ptr = 'b';   <<---- 여기서 에러가 발생합니다.


이해 되시죠?


    char * const ptr;


    ptr = &ch_data;    <<---- 여기서 에러가 발생합니다.


    *ptr = 'b';   


결론은 const가 *ptr 앞에 있느냐 ptr 앞에 있느냐로 구별하시면 됩니다.