日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

(C語(yǔ)言)共用體union的使用方法舉例

系統(tǒng) 2140 0

曾經(jīng)在學(xué)校學(xué)習(xí)C語(yǔ)言的時(shí)候一直搞不懂那個(gè)共用體union有什么用的。工作之后才發(fā)現(xiàn)它的一些妙用,現(xiàn)舉比例如以下:

1. 為了方便看懂代碼。

比方說(shuō)想寫(xiě)一個(gè)3 * 3的矩陣,能夠這樣寫(xiě):
[
注:以下用紅色部分標(biāo)記的地方是后來(lái)加入上去的,謝謝yrqing718的提醒! ]

  1. struct ?Matrix
  2. {
  3. ???? union
  4. ????{
  5. ? ? ? ? struct
  6. ??????? {
  7. ??????????? float ?_f11,?_f12,?_f13,?_f21,?_f22,?_f23,?_f31,?_f32,?_f33;
  8. ??????? };
  9. ??????? float ?f[3][3];
  10. ????}_matrix;
  11. };
  12. struct ?Matrix?m;

這兩個(gè)東西共同使用同樣的空間,所以沒(méi)有空間浪費(fèi),在須要總體用矩陣的時(shí)候能夠用
m._matrix.f (比方說(shuō)傳參,或者是總體賦值等);須要用當(dāng)中的幾個(gè)元素的時(shí)候能夠用m._matrix._f11那樣能夠避免用m.f[0][0](這樣不大直觀,并且easy出錯(cuò))。

2. 用在強(qiáng)制類型轉(zhuǎn)換上(比強(qiáng)制類型轉(zhuǎn)換更加easy看懂)
以下舉幾個(gè)樣例:

(1). 推斷系統(tǒng)用的是big endian 還是 little endian(其定義大家能夠到網(wǎng)上查相關(guān)資料,此略)

  1. #define?TRUE?1
  2. #define?FALSE?0
  3. #define?BOOL?int

  4. BOOL ?isBigEndian()
  5. {
  6. ???? int ?i?=?1;??? /*?i?=?0x00000001*/
  7. ???? char ?c?=?*( char ?*)&i;? /*?注意不能寫(xiě)成?char?c?=?(char)i;?*/
  8. ???? return ?( int )c !=?i;
  9. }
假設(shè)是little endian字節(jié)序的話,那個(gè)i = 1;的內(nèi)存從小到大依次放的是:0x01 0x00 0x00 0x00,如是,依照i的起始地址變成依照char *方式(1字節(jié))存取,即得c = 0x01;
反之亦然

或許看起來(lái)不是非常清晰,以下來(lái)看一下這個(gè):

  1. BOOL ?isBigEndian()
  2. {
  3. ???? union
  4. ????{
  5. ???????? int ?i;
  6. ???????? char ?c;
  7. ????}test;
  8. ????
  9. ????test.c?=?2;
  10. ?
  11. ???? return ?test.i?!=?2;
  12. }

這里用的是union來(lái)控制這個(gè)共享布局,有個(gè)知識(shí)點(diǎn)就是union里面的成員c和i都是從低地址開(kāi)始對(duì)齊的。相同能夠得到如此結(jié)果,并且不用轉(zhuǎn)換,清晰一些。

什么,不認(rèn)為清晰??那再看以下的樣例:

(2). 將little endian下的long long類型的值換成 big endian類型的值。已經(jīng)知道系統(tǒng)提供了以下的api:long htonl(long lg);作用是把全部的字節(jié)序換成大端字節(jié)序。因此得出以下做法:

  1. long ? long ?htonLL( long ? long ?lg)
  2. {
  3. ???? union ?
  4. ????{
  5. ???????? struct ?
  6. ????????{?
  7. ???????????? long ?low;
  8. ???????????? long ?high;
  9. ????????}val_1;
  10. ???????? long ? long ?val_2;
  11. ????}val_arg,?val_ret;
  12. ???? if (?isBigEndian()?)
  13. ???????? return ?lg;
  14. ????val_arg.val_2?=?lg;
  15. ????val_ret.val_1.low?=?htonl(?val_arg.val_1.high?);
  16. ????val_ret.val_1.high?=?htonl(?val_arg.val_1.low?);????
  17. ??? return ?val_ret.val_2;
  18. }

僅僅要把內(nèi)存結(jié)構(gòu)的草圖畫(huà)出來(lái)就比較easy明確了。

(3).為了理解c++類的布局,再看以下一個(gè)樣例。有例如以下類:

  1. class ?Test
  2. {
  3. public :
  4. ???? float ?getFVal(){? return ?f;}
  5. private :
  6. ???? int ?i;
  7. ???? char ?c;
  8. ???? float ?f;
  9. };
  10. Test t;

不能在類Test中添加代碼,給對(duì)象中的f賦值7.0f.

  1. class ?Test_Cpy
  2. {
  3. ? public :
  4. ???? float ?getVal(){? return ?f;}
  5. ???? float ?setVal( float ?f){? this ->f?=?f;}
  6. private :
  7. ???? int ?i;
  8. ???? char ?c;
  9. ???? float ?f;
  10. };
  11. ....
  12. int ?main()
  13. {
  14. ????Test?t;
  15. ???? union
  16. ????{
  17. ?????????Test?t1,?
  18. ?????????Test_Cpy?t2;
  19. ????}test;
  20. ????test.t2.setVal(7.0f);
  21. ????t?= test.t1;
  22. ????assert(?t.getVal()?==?7.0f?);???
  23. ???? return ?0;
  24. }

說(shuō)明:由于在添加類的成員函數(shù)時(shí)候,那個(gè)類的對(duì)象的布局基本不變。因此能夠?qū)懸粋€(gè)與Test類一樣結(jié)構(gòu)的類Test_Cpy,而多了一個(gè)成員函數(shù)setVal,再用uinon結(jié)構(gòu)對(duì)齊,就能夠給私有變量賦值了。(這樣的方法在有虛機(jī)類和虛函數(shù)機(jī)制時(shí)可能失靈,故不可移植)至于具體的討論,網(wǎng)上有,這個(gè)樣例在實(shí)際中沒(méi)實(shí)用途,僅僅是用來(lái)考察這個(gè)內(nèi)存布局的使用而已.

union在操作系統(tǒng)底層的代碼中用的比較多,由于它在內(nèi)存共賞布局上方便且直觀。所以網(wǎng)絡(luò)編程,協(xié)議分析,內(nèi)核代碼上有一些用到union都比較好懂,簡(jiǎn)化了設(shè)計(jì)。

(C語(yǔ)言)共用體union的使用方法舉例


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 淮安市| 陈巴尔虎旗| 仙居县| 芒康县| 新乐市| 洛隆县| 兴业县| 长顺县| 宜都市| 桃源县| 读书| 洛宁县| 兴宁市| 满洲里市| 疏勒县| 南木林县| 保德县| 渭源县| 济源市| 梁平县| 克山县| 保亭| 上高县| 东阿县| 涪陵区| 英德市| 阳西县| 沈阳市| 沧州市| 海南省| 宁城县| 乐清市| 墨江| 东兴市| 海阳市| 荣昌县| 柘城县| 塔城市| 水城县| 砚山县| 临潭县|