类型转换 类型双关
int a=9;
double value=a;//有隐式转换(在不损失数据的情况下转换类型)
value的内存
int main()
{
int a = 9;
double value = *(double*) & a;//把一个int型指针转换成一个double指针然后解引用
//实际上是在外面的int之后 继续四个字节 然后value获取了这部分内存(四个字节加四个字节)这不是我们
//用来存放整数a的内存 我们已经把内存复制到一个新的double块了 是安全的写入也是在自己的内存中,但读了不属于我们的内存
//目的是让把a的地址也当成double看
}
a的地址
value的地址
不想创建变量,还想把int当double访问
double& value=*(double*) & a;
若是写value=0.0;这很危险因为实际要写8个字节,但内存中只有4个字节分配给你
struct Entity
{
int x,y;
};//从内存角度看 可以吧这个结构体看成一个整形数组不用通过.x .y提取数据
int main()
{
Entity e={3,4};
int position=*(int*)&e;
std::cout<<position[0]<<","<<position[1]<<std::endl;
}
struct Entity
{
int x,y;
int* getposition()
{return &x;}
};//从内存角度看 可以
int main()
{
Entity e={3,4};
int* position=e.getposition();
std::cout<<position[0 ]<<","<<position[1]<<std::endl;
}
static_cast<类型>
静态类型转换
double a=5.23;
double b=(int)a+3.2//结果是8.2
double s=static_cast
dynamic_cast
执行一个检查,转换不成功会返回NULL;
reinterpret_cast
把这段内存重新解释成别的东西
用cast的好处是 编译器会做检查 不行的会报错