结构体指针之间和结构体之间的强制类型转换那些事

  结构体指针的强制类型转换在链表的使用中是很是有用的一种方式:node

  (好比咱们有一条链表(咱们知道每个链表的节点都是一种结构体),而链表中的每个节点又是某一个结构体中的成员,spa

咱们就能够经过查询链表的节点,经过将节点强制转换为某个结构体,而后咱们就能够方便的使用某个结构体的其余成员了)。指针

     那么结构体之间的强制转换又是基于什么的原理实现的呢?须要明白下面几点:内存

  一、结构体声明如何内存的分布, 
  二、结构体指针声明结构体的首地址, 
  三、结构体成员声明该成员在结构体中的偏移地址
io

      

  举个例子:原理

  

typedef struct _General_Node
{
//不管任何结点必定包含虚线内的部分
//--------------------------------
DoubleNode node; //结点
S32 Nodetype; //结点类型 不一样类型的结点对应不一样的处理方法
S32 subType; //结点子类型(多种灵活用途)

U32 NodeFlag; //标志

PDoubleNode pNode; //本结点指向的上\下层段中的结点
PDoubleList pList; //本结点指向的上\下层段指针

S32 Pid; //参数ID
S32 Caption; //标题ID

// PTOUCHAREA Touch; //结点的触摸区指针

WNDPROC DrawFunc; //绘制程序
WNDPROC ProcFunc; //焦点处理程序
//--------------------------------

}GENERALNODE, *PGENERALNODE;List

  这是一个大的结构体其中的DoubleNode node是一个链表中的节点定义为:程序

typedef struct _DoubleNode {
U32 ID; //结点的ID 每个结点有它惟一的ID
struct _DoubleNode *next;
struct _DoubleNode *previous;
} DoubleNode, *PDoubleNode;方法

  这两个结构体他们的首地址是同样的,且struct_DoubleNode为struct _General_Node子关系;
链表

  咱们知道没一种类型在内存所占的空间是不同的,好比int型在内存的读取方式为从首地址开始读取32位的数据。

而类型转换能够理解为首地址不变,咱们把其读取方式改变。

  上面的两个结构体,他们的首地址的同样,其第一个偏移也是同样因此能够进行强制类型转换()。

 

    结构体之间和结构体指针之间的转换略有不一样,其很重要的一点就是字节对齐方式。

  例如:struct  A                              struct  B

      {                                     {

         char a;                             int c;

         int b;           char d;

      } ;                                   };

    上面两个结构体式能够进行强制转换的,由于他们的对齐方式是同样的。他们之间的转换就比如char型转换为int型,int型转换为char型。

 强制类型转换就是在内存地址上的赋值,若是其强制转换,破坏告终构体的原有结构,则不行

相关文章
相关标签/搜索