c语言不同类型指针间的强转,C语言中不同的结构体类型的指针间的强制转换详解...
C語(yǔ)言中不同類(lèi)型的結(jié)構(gòu)體的指針間可以強(qiáng)制轉(zhuǎn)換,很自由,也很危險(xiǎn)。只要理解了其內(nèi)部機(jī)制,你會(huì)發(fā)現(xiàn)C是非常靈活的。
一.
結(jié)構(gòu)體聲明如何內(nèi)存的分布,
結(jié)構(gòu)體指針聲明結(jié)構(gòu)體的首地址,
結(jié)構(gòu)體成員聲明該成員在結(jié)構(gòu)體中的偏移地址。
變量的值是以二進(jìn)制形式存儲(chǔ)在內(nèi)存中的,每個(gè)內(nèi)存字節(jié)對(duì)應(yīng)一個(gè)內(nèi)存地址,而內(nèi)存存儲(chǔ)的值本身是沒(méi)有整型,指針,字符等的區(qū)別的,區(qū)別的存在是因?yàn)槲覀儗?duì)它們有不同的解讀,param的值就是一個(gè)32位值,并且存儲(chǔ)在某個(gè)內(nèi)存單元中,通過(guò)這個(gè)32位值就能找到param所指向的結(jié)構(gòu)的起始地址,通過(guò)這個(gè)起始地址和各個(gè)結(jié)構(gòu)所包含變量離起始地址的偏移對(duì)這些變量進(jìn)行引用,param->bIsDisable只是這種引用更易讀的寫(xiě)法,只要param是指向PAINT_PARAM的指針,那么param的值就肯定存在,param存在,偏移量已知,那么param->bIsDisable就肯定存在,只是要記住,param->bIsDisable只是代表了對(duì)param一定偏移地址的值。
不是說(shuō)某個(gè)地址有那個(gè)結(jié)構(gòu)體你才能引用,即使沒(méi)有,你也能引用,因?yàn)槟阋呀?jīng)告訴了編譯器param變量就是指向一個(gè)PAINT_PARAM結(jié)構(gòu)體的變量并且指明了param的值,機(jī)器碼的眼中是沒(méi)有數(shù)據(jù)結(jié)構(gòu)一說(shuō)的,它只是機(jī)械的按照指令的要求從內(nèi)存地址取值,那剛才的例子來(lái)說(shuō),peg->x,peg->y的引用無(wú)論0x30000000是否存在一個(gè)eg結(jié)構(gòu)體都是合法的,如果0x30000000開(kāi)始的8個(gè)字節(jié)存在eg結(jié)構(gòu)體,那么引用的就是這個(gè)結(jié)構(gòu)體的值,如果這個(gè)位置是未定義的值,那么引用的結(jié)果就是這8個(gè)字節(jié)中的未定義值,內(nèi)存位置總是存在的,而對(duì)內(nèi)存中值的引用就是從這些內(nèi)存位置對(duì)應(yīng)的內(nèi)存單元取值。
舉個(gè)例子 :
typedef struct_eg
{
int x;
int y;
}eg;
int point = 0x30000000;
eg *peg = (eg*)point;
可以看到point本身只是個(gè)整型變量,但是這樣的賦值是合法的,peg->x的值是0x30000000開(kāi)始的四字節(jié),peg->y是0x30000004開(kāi)始的四字節(jié)
pMsg->wParam 的值是0x30000000也就是param指向了以0x30000000為首地址的一片內(nèi)存單元,這片內(nèi)存單元以 PAINT_PARAM 的方式分布
舉個(gè)例子:
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;
它們間的強(qiáng)制轉(zhuǎn)換:
tQMSG * pTempMsg; (tQueueNode **)&pTempMsg; &pTempMsg->data 也就是 (tChatSysMsg *)&pTempMsg->data;
總結(jié)
以上是生活随笔為你收集整理的c语言不同类型指针间的强转,C语言中不同的结构体类型的指针间的强制转换详解...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: visual c 语言参考手册pdf,
- 下一篇: 单片机设置12分频c语言,AT89C51