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 |