뚜둔뚜둔✩

판다의 개발일지

C · C++

[C] const type qualifier

2021. 12. 21. 00:20

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