뚜둔뚜둔✩

판다의 개발일지

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