84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
如题, 不同类型的指针应该算是相同的吗?因为本质上都是地址, 那么按理来说应该是static cast, 但是由于指针类型不同好像又是应该用reinterpret cast,所以这种情况下该用哪种类型转换呢?
学习是最好的投资!
慎用reinterpret_cast,因为这货发明出来的目的就是用来忽悠编译器的,他的转换仅仅是更改了解释方式,而对实际数据没有任何更改,如果t的类型是TYPE,那么x=reinterpret_cast<>(t)相当于*((TYPE*)(&x))=t,如果你用reinterpret_cast去把一个int转换到float,那它只是把二进制数据完完整整拷贝了一遍,得到的结果并没有什么意义……当然退一步讲,用reinterpret_cast当然可以实现你想要的指针转换
reinterpret_cast
t的类型是TYPE
x=reinterpret_cast<>(t)
*((TYPE*)(&x))=t
而static_cast会检查类型,所以可以用于内置类型的转换(比如从int到float就能按照语义进行转换),但如果是对于指针,必须是同一棵继承树上的类型才能互相转换,并且只有上行转换(从子类到基类)才是保证安全的。
static_cast
既然你的char*和目标指针并没有啥继承关系,那么显然只能用reinterpret_cast或者C风格强转
char*
C风格强转
话说题主最近在和内存池较劲哈……
reinterpret_cast仅仅是进行重新解释,并没有实际涉及到地址的变换。在普通指针转换的时候是没有问题的,但是在父子类指针之间转换的时候,可能是不正确的结果。
慎用
reinterpret_cast
,因为这货发明出来的目的就是用来忽悠编译器的,他的转换仅仅是更改了解释方式,而对实际数据没有任何更改,如果t的类型是TYPE
,那么x=reinterpret_cast<>(t)
相当于*((TYPE*)(&x))=t
,如果你用reinterpret_cast
去把一个int转换到float,那它只是把二进制数据完完整整拷贝了一遍,得到的结果并没有什么意义……当然退一步讲,用reinterpret_cast
当然可以实现你想要的指针转换而
static_cast
会检查类型,所以可以用于内置类型的转换(比如从int到float就能按照语义进行转换),但如果是对于指针,必须是同一棵继承树上的类型才能互相转换,并且只有上行转换(从子类到基类)才是保证安全的。既然你的
char*
和目标指针并没有啥继承关系,那么显然只能用reinterpret_cast
或者C风格强转
话说题主最近在和内存池较劲哈……
reinterpret_cast
仅仅是进行重新解释,并没有实际涉及到地址的变换。在普通指针转换的时候是没有问题的,但是在父子类指针之间转换的时候,可能是不正确的结果。