【轉】C語言中不同的結構體類型的指針間的強制轉換詳解


C語言中不同類型的結構體的指針間可以強制轉換,很自由,也很危險。只要理解了其內部機制,你會發現C是非常靈活的。

一.

結構體聲明如何內存的分布, 
結構體指針聲明結構體的首地址, 
結構體成員聲明該成員在結構體中的偏移地址。

 

      變量的值是以二進制形式存儲在內存中的,每個內存字節對應一個內存地址,而內存存儲的值本身是沒有整型,指針,字符等的區別的,區別的存在是因為我們對它們有不同的解讀,param的值就是一個32位值,並且存儲在某個內存單元中,通過這個32位值就能找到param所指向的結構的起始地址,通過這個起始地址和各個結構所包含變量離起始地址的偏移對這些變量進行引用,param->bIsDisable只是這種引用更易讀的寫法,只要param是指向PAINT_PARAM的指針,那么param的值就肯定存在,param存在,偏移量已知,那么param->bIsDisable就肯定存在,只是要記住,param->bIsDisable只是代表了對param一定偏移地址的值。

      不是說某個地址有那個結構體你才能引用,即使沒有,你也能引用,因為你已經告訴了編譯器param變量就是指向一個PAINT_PARAM結構體的變量並且指明了param的值,機器碼的眼中是沒有數據結構一說的,它只是機械的按照指令的要求從內存地址取值,那剛才的例子來說,peg->x,peg->y的引用無論0x30000000是否存在一個eg結構體都是合法的,如果0x30000000開始的8個字節存在eg結構體,那么引用的就是這個結構體的值,如果這個位置是未定義的值,那么引用的結果就是這8個字節中的未定義值,內存位置總是存在的,而對內存中值的引用就是從這些內存位置對應的內存單元取值。

 

舉個例子 :


typedef struct_eg 

     int x; 
     int y; 
}eg; 
int point = 0x30000000; 
eg *peg = (eg*)point;

可以看到point本身只是個整型變量,但是這樣的賦值是合法的,peg->x的值是0x30000000開始的四字節,peg->y是0x30000004開始的四字節 
pMsg->wParam 的值是0x30000000也就是param指向了以0x30000000為首地址的一片內存單元,這片內存單元以 PAINT_PARAM 的方式分布


舉個例子:

 

typedef struct QueueNode
{
 struct QueueNode * pNext;
}tQueueNode;

 

typedef struct QMSG
{
 tQueueNode Node;
 tChatSysMsg data;
 
}tQMSG;

 

typedef struct ChatSysMsg
{
 int  Connfd;
 char  Version;
 char  MsgType;
 char SerialNumber;
 int  MsgLen;
 char Msg[MAX_NUM_STR]; 
}tChatSysMsg;

 

它們間的強制轉換:

tQMSG * pTempMsg;
(tQueueNode **)&pTempMsg;
&pTempMsg->data    也就是 (tChatSysMsg *)&pTempMsg->data;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM