C/C++/포인터2011. 5. 13. 10:36
const는 상수성을 지정하기 위해서 사용합니다.
그런데.. 이게 포인터와 사용하다 보면 많이 헷갈립니다..
(저만 그런건가요.. ㅠㅠ)
그래서 간략하게 정리해볼까 합니다. 

변수 a에 대해서 const를 붙일 수 있는 경우는
// const 한 개
/* 1 */const char *a = "abcd";
/* 2 */char const *a = "abcd";
/* 3 */char *const a = "abcd";

// const 두 개
/* 4 */const char *const a = "abcd";
/* 5 */char const *const a = "abcd";
 

요정도가 되겠습니다.
여기서 1번과 2번은 같은 의미입니다.
그냥 const와 char의 순서만 다른겁니다.
1,2번과 3번의 의미가 다릅니다.

밑에 글을 읽기 전에 이 한 줄을 읽고 보시면 이해하시기 편하실겁니다.
"const는 바로 뒤에것을 상수로 만든다!!!"

하나하나 살펴보시죠.. ^^
* 표시 앞에 const 지정자가 붙으면(1, 2번)
char *a가 상수성을 가진다는 겁니다.
char *a == "abcd"이므로 "abcd"가 상수라는 뜻이됩니다.
즉, "abcd"를 못 바꾼다는 겁니다.
a[0] = '2', 이렇게 대입을 못한다는 겁니다.
a[0]에 해당하는 값은 "abcd"의 'a'이고 이게 상수이므로 바꾸지 못합니다.
하지만 변수 a 자체는 상수가 아니기 때문에 주소는 바꿀 수 있습니다.
즉, a = "1234", 이렇게 a에 새로운 문자열 주소를 대입 할 수 있는 거죠.

* 표시 뒤에 const 지정자가 붙으면(3번)
이건, 변수 a가 상수라는 겁니다.
즉, 변수가 상수성을 가지기 때문에 '주소'를 바꾸지 못한다는 뜻이 됩니다.
a = "1234", 이렇게 못 바꾼다는 거죠.
왜냐하면, 주소값이 상수성을 내포하기 때문에 다른 문자열 주소로 바꾸지 못하는 겁니다.
따라서 이런 경우에는 선언과 동시에 값을 대입해줘야 합니다.
하지만 대입받은 값들이 상수는 아니기 때문에
a[0] = '2', 이렇게 하나하나씩 바꿀 수 있습니다.

그럼 4,5번과 같이 const를 둘다 쓰면 어떻게 될까요?
1, 2번과 3번 둘 다의 속성을 가지게 됩니다.

1. 변수 자체가 상수다, 고로 한번 대입받으면 다른것을 대입 못한다.
2. 대입 받은 값 자체가 상수다, 고로 대입 받은 값을 하나하나씩도 못바꾼다.
3. 선언과 동시에 값을 대입해줘야 하는건 기본이다.(* 뒤에 const가 있으므로) 
Posted by 투명테잎