亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 1786 0

曾經在學校學習C語言的時候一直搞不懂那個共用體union有什么用的。工作之后才發現它的一些妙用,現舉比例如以下:

1. 為了方便看懂代碼。

比方說想寫一個3 * 3的矩陣,能夠這樣寫:
[
注:以下用紅色部分標記的地方是后來加入上去的,謝謝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;

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

2. 用在強制類型轉換上(比強制類型轉換更加easy看懂)
以下舉幾個樣例:

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

  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;? /*?注意不能寫成?char?c?=?(char)i;?*/
  8. ???? return ?( int )c !=?i;
  9. }
假設是little endian字節序的話,那個i = 1;的內存從小到大依次放的是:0x01 0x00 0x00 0x00,如是,依照i的起始地址變成依照char *方式(1字節)存取,即得c = 0x01;
反之亦然

或許看起來不是非常清晰,以下來看一下這個:

  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來控制這個共享布局,有個知識點就是union里面的成員c和i都是從低地址開始對齊的。相同能夠得到如此結果,并且不用轉換,清晰一些。

什么,不認為清晰??那再看以下的樣例:

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

  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. }

僅僅要把內存結構的草圖畫出來就比較easy明確了。

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

  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中添加代碼,給對象中的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. }

說明:由于在添加類的成員函數時候,那個類的對象的布局基本不變。因此能夠寫一個與Test類一樣結構的類Test_Cpy,而多了一個成員函數setVal,再用uinon結構對齊,就能夠給私有變量賦值了。(這樣的方法在有虛機類和虛函數機制時可能失靈,故不可移植)至于具體的討論,網上有,這個樣例在實際中沒實用途,僅僅是用來考察這個內存布局的使用而已.

union在操作系統底層的代碼中用的比較多,由于它在內存共賞布局上方便且直觀。所以網絡編程,協議分析,內核代碼上有一些用到union都比較好懂,簡化了設計。

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美日韩久久中文字幕 | 精品视频一区二区 | 国产亚洲图片 | 亚洲va国产va欧美va综合 | 国产伦久视频免费观看视频 | 欧美午夜寂寞影院安卓列表 | 亚洲精品久久久久久久久久ty | 91久草视频| 久久99免费视频 | 香蕉成人在线视频 | 久草国产精品 | 日日躁夜夜躁狠狠天天 | 欧美日韩亚毛片免费观看 | 久久精品国产一区二区三区日韩 | 91新视频| 久操视频免费在线观看 | 新久草在线| 国产51自产区在线 | 狠狠色丁香婷婷久久综合考虑 | 在线亚洲精品视频 | 人人爱人人性 | 国产精品一国产精品免费 | 久草网视频在线观看 | 91福利在线视频 | 欧美精品在线看 | 欧美日韩成人在线视频 | 欧美成人免费一级人片 | 一本一本久久a久久精品综合 | 欧美日韩性猛交xxxxx免费看 | 亚洲欧美日韩一级特黄在线 | 伊人免费网 | 一区视频在线播放 | 日本欧美一区二区三区 | 色丁香六月 | 首页 动漫 亚洲 欧美 日韩 | 日本激情一区二区三区 | 9999在线视频 | 国产色视频 | 99久久免费费视频在线观看 | 深夜福利网站在线观看 | 亚洲精品一区二区中文 |