const
type qualifier(형식 한정자)는 개체를 수정할 수 없는 것으로 선언한다.
즉, 일반적으로 설정된 값을 변경할 수 있던 변수를 read-only 성질로 변경한다. 따라서 const
사용을 통해 컴파일러에게 특정 변수의 값은 변경되어선 안 된다는 정보를 전달할 수 있다.
#1. 포인터가 아닌 변수의 상수화
const int n = 10;
n = 20; // ERROR, type of n is const-qualified
포인터가 아닌 변수에 const
를 붙이면 해당 변수는 처음에 지정된 값으로만 읽을 수 있으며, 새로운 값을 지정할 수 없다.
#2. non-constant pointer to constant data (포인터 변수의 상수화)
const int *p = &x;
*p = 10; // ERROR, type of *p is const-qualified
또, 다음과 같은 순서의 선언도 동일한 효과이다.
int const *p = &x;
#3. constant pointer to non-constant data (포인터 변수의 상수화)
int * const p = &x;
*p = 10; // OK
p = &y; // ERROR
여기서 const
는 앞의 int *
타입을 수식하여 const-qualify 한다. 즉, int *
타입의 p
를 변경할 수 없기 때문에 p
는 항상 동일한 메모리 위치만을 가리키고 있어야 한다.
#4. constant pointer to constant data (포인터 변수의 상수화)
const int * const p = &x;
*p = 20; // ERROR
p = &y; // ERROR
이와 같은 선언에서는 int *
타입과 int
타입 모두 상수화 된다. 따라서 p
는 항상 동일한 메모리 위치를 가리키면서 p
가 가리키는 메모리에 저장된 값 역시 변경할 수 없다.
#2에서와 마찬가지로 다음과 같은 순서의 선언도 동일한 효과이다.
int const * const p = &x;
이렇게 봐서도 여전히 이해가 어렵다면 다음 그림을 보자.
결국 const-qualify 되는 것은 const
뒤에 뒤따르는 타입이라고 생각하면 된다.
const-qualified type |
불가 | |||
#1 | p 타입 |
→ | int |
p = x; |
#2 | *p 타입 |
→ | int |
*p = x; |
#3 | p 타입 |
→ | int* |
p = &x; |
#4 | p 타입 |
→ | int* |
p = &x; |
*p 타입 |
→ | int |
*p = x; |
※ x
의 타입은 int
References
・ https://en.cppreference.com/w/c/language/const
'C · C++' 카테고리의 다른 글
[C(++)] Header Guard (헤더 가드) Coding (0) | 2022.02.05 |
---|---|
[C] printf 함수 (0) | 2021.12.21 |
[C++] namespace 사용 및 특징 (0) | 2021.12.18 |
[C++] 범위 확인 연산자 (::) (0) | 2021.12.15 |
[C++] namespace (0) | 2021.12.15 |