union 關鍵字的用法與struct 的用法非常類似。
union 維護足夠的空間來置放多個資料成員中的「一種」,而不是為每乙個資料成員配置空間,在union 中所有的資料成員共用乙個空間,同一時間只能儲存其中乙個資料成員,所有的資料成員具有相同的起始位址。例子如下:
union statemachine
;乙個union 只配置乙個足夠大的空間以來容納最大長度的資料成員,以上例而言,最大長度是double 型態,所以statemachine 的空間大小就是double 資料型別的大小。
在c++裡,union 的成員預設屬性頁為public。union 主要用來壓縮空間。如果一些資料不可能在同一時間同時被用到,則可以使用union。
下面再看乙個例子:
union
*p, u;
p =&u;
p->a[0] = 0x39;
p->a[1] = 0x38;
p.i 的值應該為多少呢?
這裡需要考慮儲存模式:大端模式和小端模式。
union 型資料所佔的空間等於其最大的成員所佔的空間。對union 型的成員的訪問都是相對於該聯合體基位址的偏移量為0 處開始,也就是聯合體的訪問不論對哪個變數的訪問都是從union 的首位址位置開始。如此一解釋,上面的問題是否已經有了答案呢?
上述問題似乎還比較簡單,那來個有技術含量的:請寫乙個c 函式,若處理器是big_endian 的,則返回0;若是little_endian 的,則返回1。
先分析一下,按照上面關於大小端模式的定義,假設int 型別變數i 被初始化為1。
以大端模式儲存,其記憶體布局如下圖:
以小端模式儲存,其記憶體布局如下圖:
變數i 佔4 個位元組,但只有乙個位元組的值為1,另外三個位元組的值都為0。如果取出低位址上的值為0,毫無疑問,這是大端模式;如果取出低位址上的值為1,毫無疑問,這是小端模式。既然如此,我們完全可以利用union 型別資料的特點:所有成員的起始位址一致。
int checksystem( )
c;c.i = 1;
return (c.ch ==1);
}現在你可以用這個函式來測試你當前系統的儲存模式了。當然你也可以不用函式而直接去檢視記憶體來確定當前系統的儲存模式。如下圖:
圖中0x01 的值存在低位址上,說明當前系統為小端模式。
不過要說明的一點是,某些系統可能同時支援這兩種儲存模式,你可以用硬體跳線或在編譯器的選項中設定其儲存模式。
留個問題:在x86 系統下,輸出的值為多少?
#include
intmain()
;int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
編寫乙個判斷指令碼
4案例4 編寫乙個判斷指令碼 4.1 問題 本例要求在虛擬機器server0上建立 root foo.sh指令碼,任務目標如下 當執行 root foo.sh redhat,輸出為fedora 當執行 root foo.sh fedora,輸出為redhat 當沒有任何引數或者引數不是redhat或...
乙個比喻講明Docker是什麼
之前一直聽運維的同事講docker,說弄個docker映象,打包些應用什麼的,還有時不時地在一些帖子裡見到過關於docker的三言兩語,然後自己也自我感覺良好的把它總結歸納了一下認為 往docker裡面打包一大堆的應用,然後我就可以拿著這個docker,到處執行了 就因為這,還鬧出過笑話,所以啊,是...
編寫乙個演算法判斷乙個數是不是「快樂數」。
乙個 快樂數 的定義為 對於乙個正整數,每一次將該數替換為它每個位置上的數字的平方和,然後重複這個過程直到這個數變為1,也可能是無限迴圈但始終變不到1.如果可以變為1,那麼這個數就是快樂數。例項 輸入 19 輸出 true 解釋 1 2 9 2 82 8 2 2 2 68 6 2 8 2 100 1...