不同的数据类型如int,float,double以及我们通过结构体struct自己创建的数据类型,在内存所占的空间是不一样的。例如int型占四个字节,在内存的读取方式为从首地址开始读取32位的数据。
强制类型转换可以理解为首地址不变,我们把其读取方式改变。来看这样一个例子,通过这个例子可以对结构体内数据存储方式以及强制类型转换有更直观的认识。
#includeusing namespace std; struct Str { int a=10; int b=10; }; int main() { int intr=6; Str gintr; gintr=*((Str *)&intr); cout<
从上图中我们可以直观地看到对变量intr的地址进行结构体Str强制指针类型转换就相当于把&intr作为结构体Str的首地址,申请了一块在逻辑上连续的内存(在物理内存上可能不连续),范围为结构体的大小。变量a和b相当于结构体占用的这部分空间中的各自的部分,a首地址0xc000,b首地址0xc004。
当我们去访问这部分空间的时候,变量a所在空间首地址与变量intr首地址相同,并且变量a与变量intr是同一类型,所以gintr.a=6,而变量b所在的空间并没有初始化,所以这部分空间存放的是垃圾值,所以gintr.b=0。
基于这个原理,我们再来看这样一个例子:((unsigned int) &((Str *)0)->b)。
为了便于分析,将括号拿掉,语句进行拆解,可以看到这条语句可以分成这么几个步骤:0 //强制转换的首地址从0x0000开始 ((Str *)0) //强制结构体指针类型转换 ( ((Str *)0)->b ) //通过指针的方式访问b所在的空间 &( ((Str *)0)->b ) //返回b所在空间的首地址 ( (unsigned int) &( ((Str *)0)->b ) // 将首地址类型转换成unsigned int型



