結構體指針之間和結構體之間的強制類型轉換那些事

  結構體指針的強制類型轉換在鏈表的使用中是很是有用的一種方式: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型。

 強制類型轉換就是在內存地址上的賦值,若是其強制轉換,破壞告終構體的原有結構,則不行

相關文章
相關標籤/搜索