<개인공부>/[C++]

[C++] reinterpret_cast (타입캐스트 연산자)

BlockDMask 2017. 11. 29. 01:00
반응형
  • 안녕하세요 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) : " << *<< 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

감사합니다.

반응형