类型转换可以理解成一个特殊的复制或赋值过程,内容逐字节的拷贝,即所谓的位拷贝。如果源类型和目标类型的内存大小相同的话,则值是相同的。但有可能数据类型不一样,会导致操作不一样。就比如指针的类型转换,指针的值是不变的,但是指针所指向的 地址为指针值的对象发生变化了。就比如指针到整型的转换,将16进制表示的地址转换为10进制来表示并存放在整型变量中。
举个两个列子:
Example 1.1:
double val=3.1;
double *pd=&val;
int *pi=(int*)(pd);
因为指针的大小都是相同的,所以可以知道pd和pi的值是一样的,都等于val的地址;但是因为指针的类型不一样,所以指向的对象是不一样的,pd指向的是val,而pi指向是一个整型变量,其地址与val的地址是一样的。然后我们就可以通过*pi来引用这个地址上的整型变量,通过*pi来修改这个地址上的整形变量的值。
Example 1.2:
#include <iostream>
using namespace std;
classA
{
public:
A() {cout<<"call A construct"<<endl;}
~A() {cout<<"call A destroy"<<endl;}
void print() {cout<<a<<endl;}
private:
int a;
};
classB
{
public:
B(int val):b(val) {cout<<"call B construct"<<endl;}
~B() {cout<<"call B destroy"<<endl;}
void print() {cout<<b<<endl;}
private:
int b;
};
int main()
{
A* pa=new A;
B* pb=(B*)new(pa)B(3);
pb->print();
pb->print();
pb->~B();
delete pa;
pa=NULL;
pb=NULL;
return 0;
}
pa和pb的值是一样的,即记录的地址都是这个A类对象的地址,而且pa和pb所指向的类型的内存布局是一样的,所以pa和pb所指向的是同一块内存,所以pa所指向的对象的成员a值等于pb所指向的对象的成员b值。
Example 2:
int addr=0x0012FF38;
int *p=(int*)(addr);
将16进制的地址转换为10进制的整数,用addr存放。
然后将addr转换成int*类型,目的是p指向地址为addr的整型变量,从而使用*p 可以对其变量进行操作。或者可以这样说将addr转换为int*类型,让p指向地址为addr的前4字节的内容,通过使用*p来获取这4字节的内容。