개발자 면접 공부/C-C++

const int* p 와 int * const p의 차이점

chogyujin 2023. 5. 7. 19:02
728x90

1. 개요

오늘은 const int* p 와 int* const p의 차이점을 공부하도록 하겠습니다.

 


2. 설명

const 는 상수 이므로 대상 변수를 선언한뒤 초기화를 해주면 값을 변경을 안해주는 것을 의미합니다.

 

ex)

    const int a=5;
    a = 6; // 에러 대상은 상수이므로 변경을 할수 없음

이런 경우에는 대상이 상수이므로 값을 변경할수 없습니다.
그러면 const int * p =  new int(5); 라는 식은 처음의 초기화를 진행했지만 나중에 값을 변경을 못하는것일가여 아니면 주소값을 변경을 못하는것 일가여??

 


3. const int * p == int const * p

결론 부터 말씀드리면 const int* p 는 *p의 값 즉 Heap에 저장되있는 값을 변경을 못하는 것 입니다.
그렇다는건 const int * p 는 주소값 즉 참조하는 주소를 변경할수 있을가여??

 

정답은 Yes 입니다.

아래의 예시를 보면

    const int* p = new int(5);
    *p = 4; // 에러 대상이 const int type 입니다.

이렇게 에러가 나옵니다.

하지만 const int* p 는 처음부터 new로 초기화를 해줄필요가 없습니다.

const int* p; // 가능

이렇게 말이지요

그리고 굳이 new로 초기화 할것이 아니라 레퍼런스인 &을 이용하여 다른 변수의 주소를 참조할수 있습니다.

하지만 그 주소를 참조한 값을 변경을 할수가 없습니다.

    int a = 5;
    const int* p=&a; // 가능
    *p = 2; // 에러 대상이 const int type입니다.

자고로 이것도 똑같은 식 입니다
int const* p  == const int*p;

이렇게 말이지요

그럼 이제 int * const p를 알아보겠습니다.


4. int * const p

int* const p 는 위에 const int*p 와 int const*p와 다르게 주소값을 변경을 할수가 없습니다.

그러므로 *p=5; 는 가능하지만 p = &a; 같은 주소 참조가 불가능합니다.

 

ex)

    int* const p = new int(5);
    int a = 4;
    p = &a; // 에러 대상이 int*const type입니다.

또한 int*const p 는 반드시 할당을 받아줘서 초기화를 진행해줘야합니다.
안그러면 에러가 나옵니다.


5. 두 예제 조합

두 가지의 const를 조합해서 만들면 어떻게 될가여?
const int * const == int const * const

 

이런 경우에는 주소값도 변경 안되며 포인터 Heap의 값도 변경이 불가능 합니다.

const int * const p = new int(5);
int a = 4;
*p = 4;// 에러 대상이 const int type입니다.
p = &a; // 에러 대상이 const int *const type입니다.

이렇게 말이지요

int const* const p = new int(5);
int a = 4;
*p = 4;// 에러 대상이 const int type입니다.
p = &a; // 에러 대상이 const int *const type입니다.

또한 이렇게 표현도 가능합니다.!

 


6. 요약

 

1. const int* p == int const * p  는 Heap의 값만 변경이 안된다.

2. int * const p 는 주소값 변경이 불가능하다 (참조값 변경 불가)

3. const int* const p == int const*const p 는 둘다 변경이 안된다 (짬뽕)

 

 

'개발자 면접 공부 > C-C++' 카테고리의 다른 글

RVO vs NRVO  (0) 2023.05.11
Constexpr VS Const  (0) 2023.05.09
C++ 템플릿(함수 템플릿)  (0) 2022.09.22
C++ STL 장단점  (0) 2022.09.21
C++의 인터페이스(Interface)  (0) 2022.09.17