日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

c语言不同类型指针间的强转,C语言中不同的结构体类型的指针间的强制转换详解...

發(fā)布時(shí)間:2024/4/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言不同类型指针间的强转,C语言中不同的结构体类型的指针间的强制转换详解... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C語(yǔ)言中不同類型的結(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ǔ)的值本身是沒有整型,指針,字符等的區(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只是這種引用更易讀的寫法,只要param是指向PAINT_PARAM的指針,那么param的值就肯定存在,param存在,偏移量已知,那么param->bIsDisable就肯定存在,只是要記住,param->bIsDisable只是代表了對(duì)param一定偏移地址的值。

不是說(shuō)某個(gè)地址有那個(gè)結(jié)構(gòu)體你才能引用,即使沒有,你也能引用,因?yàn)槟阋呀?jīng)告訴了編譯器param變量就是指向一個(gè)PAINT_PARAM結(jié)構(gòu)體的變量并且指明了param的值,機(jī)器碼的眼中是沒有數(shù)據(jù)結(jié)構(gòu)一說(shuō)的,它只是機(jī)械的按照指令的要求從內(nèi)存地址取值,那剛才的例子來(lái)說(shuō),peg->x,peg->y的引用無(wú)論0x30000000是否存在一個(gè)eg結(jié)構(gòu)體都是合法的,如果0x30000000開始的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開始的四字節(jié),peg->y是0x30000004開始的四字節(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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。