반응형
안녕하세요 BlockDMask 입니다.
이번에는 C++ 의 네가지 타입 캐스트 연산자 중에
(static_cast, const_cast, reinterpret_cast, dynamic_cast)
reinterpret_cast 에 대해 알아보겠습니다.
>reinterpret_cast 에 관한 기본 특성
reinterpret_cast<new_type>(expression)
reinterpret_cast<바꿀 타입>(대상)
reinterpret_cast는 임의의 포인터 타입끼리 변환을 허용하는 캐스트 연산자 입니다.
또한 정수형을 포인터로 바꿀 수도 있습니다. (이때 정수값이 포인터의 절대 주소로 들어가게 됩니다. -> 위험)expression에 해당하는 것을 new_type으로 비트단위로 바꾸는 것 입니다.
다른 형태의 포인터로 변경이 가능하기 때문에 결과 값이 잘못 사용하는 경우에는
결과 값이 컴파일러에 따라 다를 수도 있고, 예상하지 않는 값이 나올 수 있습니다.
> 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include<iostream> #include<cstdio> using namespace std; struct Cube{ int a; }; int main(void){ int a = 71234561; //1. int -> int * 로 타입캐스팅 //변수 a의 값을 절대주소로 받는 포인터 ptr1 //이 경우에는 주소 111번지를 가리키고 있는 poiner가 됩니다. //111번지가 어느곳을 가리킬지 모르기 때문에 위험합니다. int *ptr1; ptr1 = reinterpret_cast<int *>(a); //2. int * -> char * 로 타입캐스팅 //컴파일러에 따라 다르게 나옵니다. int *ptr2 = &a; char * c; c = reinterpret_cast<char *>(ptr2); cout << "2. int* -> char * (cout) : " << *c << endl; printf("2. int* -> char * (printf int type) : %d\n", *c); //3. struct 내의 첫번째 int -> int * //struct cube에는 int 형 변수 하나만 존재 하므로, //ptr3은 int a변수의 시작점을 잘 가리키고 있습니다 Cube cb; cb.a = 20; int * ptr3; ptr3 = reinterpret_cast<int *>(&cb); cout << "3. struct -> int * : " << *ptr3 << endl; return 0; } | cs |
--> 결과
<참고자료>
http://en.cppreference.com/w/cpp/language/reinterpret_cast
감사합니다.
반응형
'<개인공부> > [C++]' 카테고리의 다른 글
[C++] array container 정리 및 사용법 (std::array) (4) | 2019.03.15 |
---|---|
[C++] new, delete 동적할당과 해제에 대해서 (0) | 2018.12.04 |
[C++] 가상함수와 순수가상함수의 차이(virtual, pure virtual)에 대해서 (8) | 2018.08.13 |
[C++] dynamic_cast (타입캐스트 연산자) (1) | 2018.07.25 |
[C++] const_cast (타입 캐스트 연산자) (2) | 2017.11.28 |
[C++] static_cast (타입캐스트 연산자) (4) | 2017.11.28 |
[C++] sort algorithm 정리 및 예시 (6) | 2017.10.17 |
[C++] 레퍼런스, Reference, 참조자 (0) | 2017.09.23 |