如题, 不同类型的指针应该算是相同的吗?因为本质上都是地址, 那么按理来说应该是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
仅仅是进行重新解释,并没有实际涉及到地址的变换。在普通指针转换的时候是没有问题的,但是在父子类指针之间转换的时候,可能是不正确的结果。