모든 언어에는 형변환이 있습니다. C++에선 다양한 형번환 객체들을 제공합니다.
1. static_cast = https://hwan-shell.tistory.com/211
2. dynamic_cast = https://hwan-shell.tistory.com/213
3. const_cast = https://hwan-shell.tistory.com/215
4. reinterpret_cast
가 있습니다.
그 중 reinterpret_cast에 대해 알아보도록 하겠습니다.
1. reinterpret_cast란?
2. 예시
1) int * -> char -> int *
결과가 제대로 나오지 않을 뿐더러 중간에 프로그램이 터졌습니다.
그 이유는 char c = reinterpret_cast<char>(p);
부분 때문입니다.
여기서 c로 값이 전달 될 때 이미 받은 값은 변형이 일어나 '\0'이 됩니다.
또한 일반 변수가 포인터 성격을 띄우면서 받게되죠.
디 어셈블리로 보면 p가 가르키는 주소값이 들어가는 것이 아니라 '\0'이 들어가는 걸 확인할 수 있습니다.
그 수 int* temp = reinterpret_cast<int *>(c);
를 한다면 nullptr이 넘어가서 printf()
에서 프로그램이 터지는 것입니다.
때문에 104라고 출력된 숫자도 정상적인 값 출력이 아닌 것입니다.
반대로 long과 unsigned int를 보겠습니다.
2) int * -> long or unsigned int -> int *
주소값, 데이터가 잘 유지되면서 넘어간걸 확인할 수 있습니다.
3) int * -> char * -> int *
위와 같은 경우는 잘 되는걸 확인 할 수 있습니다.
char* 는 표현할 수 있는 수가 -128 ~ 127까지 이기 때문입니다.
또한 char*은 1바이트까지 표현할 수 있지만 포인터형이기 때문에 기본 자료형 크기는 4바이트 입니다.
따라서 주소값이 잘 유지되는걸 알 수 있습니다.
그럼 10000을 넣어보겠습니다.
값의 출력은 깨졌지만 원본 주소값은 온전히 int* temp로 넘어간걸 확인 할 수 있습니다.
때문에 포인터간의 reinterpret_cast는 출력하는 값은 깨져도 원본은 유지된다는걸 알 수 있습니다.
4) int * -> void * -> long *
int *p를 void *v로 받은 후 reinterpret_cast를 통해 long* 로 바꿔주고 있습니다.
잘 실행됩니다. reinterpret_cast를 사용하지 않고선 저런 방식이 불가능 하죠... void이기 때문에....
여러가지 예시를 나열해 봤는데..... 유익한 정보인지는 모르겠네요....
잘 사용하지도 않을 것 같고..... 흠....
'프로그래밍 > C++' 카테고리의 다른 글
C++ 가상 상속(virtual inheritance) (4) | 2020.06.20 |
---|---|
C++ 순수 가상 함수란? 추상 클래스란??(pure virtual function, abstract class) (2) | 2020.06.20 |
C++] const_cast에 대해서... (2) | 2020.06.15 |
C++] dynamic_cast에 대해서... (0) | 2020.06.14 |
C++] static_cast란?? (6) | 2020.06.14 |
댓글