强制的类型转换

类型转换可以理解成一个特殊的复制或赋值过程,内容逐字节的拷贝,即所谓的位拷贝。如果源类型和目标类型的内存大小相同的话,则值是相同的。但有可能数据类型不一样,会导致操作不一样。就比如指针的类型转换,指针的值是不变的,但是指针所指向的 地址为指针值的对象发生变化了。就比如指针到整型的转换,将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字节的内容。

你可能感兴趣的:(强制的类型转换)