• <output id="aynwq"><form id="aynwq"><code id="aynwq"></code></form></output>

    <mark id="aynwq"><option id="aynwq"></option></mark>
  • <mark id="aynwq"><option id="aynwq"></option></mark><label id="aynwq"><dl id="aynwq"></dl></label>
  • 學習啦>學習英語>專業英語>計算機英語>

    c語言中union的用法

    時間: 長思709 分享

      c語言中union的用法的用法你知道嗎?下面小編就跟你們詳細介紹下c語言中union的用法的用法,希望對你們有用。

      c語言中union的用法的用法如下:

      01.struct Matrix

      02.{

      03. union

      04. {

      05. struct

      06. {

      07. float _f11, _f12, _f13, _f21, _f22, _f23, _f31, _f32, _f33;

      08. };

      09. float f[3][3];

      10. }_matrix;

      11.};

      12.

      13.struct Matrix m;

      14.

      這兩個東西共同使用相同的空間,所以沒有空間浪費,在需要整體用矩陣的時候可以用

      m._matrix.f (比如說傳參,或者是整體賦值等);需要用其中的幾個元素的時候可以用m._matrix._f11那樣可以避免用m.f[0][0](這樣不大直觀,而且容易出錯)。

      2. 用在強制類型轉換上(比強制類型轉換更加容易看懂)

      下面舉幾個例子:

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

      01.#define TRUE 1

      02.#define FALSE 0

      03.#define BOOL int

      04.

      05.

      06.BOOL isBigEndian()

      07.{

      08. int i = 1; /* i = 0x00000001*/

      09. char c = *(char *)&i; /* 注意不能寫成 char c = (char)i; */

      10. return (int )c != i;

      11.}

      如果是little endian字節序的話,那個i = 1;的內存從小到大依次放的是:0x01 0x00 0x00 0x00,如是,按照i的起始地址變成按照char *方式(1字節)存取,即得c = 0x01;

      反之亦然

      也許看起來不是很清晰,下面來看一下這個:

      01.BOOL isBigEndian()

      02.{

      03. union

      04. {

      05. int i;

      06. char c;

      07. }test;

      08.

      09. 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);作用是把所有的字節序換成大端字節序。因此得出下面做法:

      01.long long htonLL(long long lg)

      02.{

      03. union

      04. {

      05. struct

      06. {

      07. long low;

      08. long high;

      09. }val_1;

      10. long long val_2;

      11. }val_arg, val_ret;

      12.

      13.

      14. if ( isBigEndian() )

      15. return lg;

      16. val_arg.val_2 = lg;

      17.

      18.

      19. val_ret.val_1.low = htonl( val_arg.val_1.high );

      20. val_ret.val_1.high = htonl( val_arg.val_1.low );

      21.

      22. return val_ret.val_2;

      23.}

      只要把內存結構的草圖畫出來就比較容易明白了。

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

      01.class Test

      02.{

      03.public :

      04. float getFVal(){ return f;}

      05.private :

      06. int i;

      07. char c;

      08. float f;

      09.};

      10.Test t;

      不能在類Test中增加代碼,給對象中的f賦值7.0f.

      01.class Test_Cpy

      02.{

      03. public :

      04. float getVal(){ return f;}

      05. float setVal(float f){ this ->f = f;}

      06.private :

      07. int i;

      08. char c;

      09. float f;

      10.};

      11.

      12.....

      13.

      14.int main()

      15.{

      16. Test t;

      17. union

      18. {

      19. Test t1,

      20. Test_Cpy t2;

      21. }test;

      22.

      23. test.t2.setVal(7.0f);

      24. t = test.t1;

      25. assert( t.getVal() == 7.0f );

      26.

      27. return 0;

      28.}

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

    c語言中union的用法

    c語言中union的用法的用法你知道嗎?下面小編就跟你們詳細介紹下c語言中union的用法的用法,希望對你們有用。 c語言中union的用法的用法如下: 01.struct Matrix 02.{ 03. union 04. { 05. struct 06. { 07. float _f11, _f12, _f13, _f
    推薦度:
    點擊下載文檔文檔為doc格式

    精選文章

    • c語言中typedef的用法
      c語言中typedef的用法

      c語言中typedef的用法的用法你知道嗎?下面小編就跟你們詳細介紹下c語言中typedef的用法的用法,希望對你們有用。 c語言中typedef的用法的用法如下: 一.基

    • c語言中time函數的用法
      c語言中time函數的用法

      c語言中time函數的用法的用法你知道嗎?下面小編就跟你們詳細介紹下c語言中time函數的用法的用法,希望對你們有用。 c語言中time函數的用法的用法如下:

    • c語言中table的用法有哪些
      c語言中table的用法有哪些

      C語言對于初學者來說是很復雜的,那么c語言中table的用法的用法你知道嗎?下面學習啦小編就跟你們詳細介紹下c語言中table的用法,希望對你們有用。 c語

    • c語言中switch的用法
      c語言中switch的用法

      c語言中switch的用法的用法你知道嗎?下面小編就跟你們詳細介紹下c語言中switch的用法的用法,希望對你們有用。 c語言中switch的用法的用法如下: C語言還

    533450 主站蜘蛛池模板: 精品国产污污免费网站入口 | 波多野结衣日本电影| 国产精品成人久久久久久久| 久久天天躁狠狠躁夜夜躁2014 | 国产精品视频观看| 久久久国产99久久国产久| 男女一边摸一边做爽视频| 国产精品自在线拍国产手青青机版| 久久国产欧美另类久久久| 男人天堂综合网| 国产成人小视频| jux434被公每天侵犯的我| 杨晨晨白丝mm131| 免费无码看av的网站| 欧美精品www| 女人扒开裤子让男人桶| 亚洲av产在线精品亚洲第一站| 精品国产v无码大片在线看| 国产福利一区二区三区在线观看| 不卡视频免费在线观看| 欧美xxxxx在线观看| 免费看片在线观看| 黑人26厘米大战亚洲女| 天下第一日本高清国语在线观看 | 西西人体大胆扒开瓣| 国内精品久久久久久99蜜桃 | 国产精品成人第一区| 中国国产aa一级毛片| 欧美一区二区三区久久综| 免费无码看av的网站| 顶级欧美色妇xxxxx| 国产香蕉97碰碰久久人人| 中文字幕久久综合| 最近最新中文字幕| 亚洲精品视频免费看| 老司机在线精品| 国产无套在线播放| 999精品在线| 性欧美丰满熟妇XXXX性| 久久精品无码一区二区日韩av| 波多野结衣被三个小鬼|