您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何掌握C語言聯合體Union特點及運用”,在日常操作中,相信很多人在如何掌握C語言聯合體Union特點及運用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何掌握C語言聯合體Union特點及運用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
聯合是一種特殊的自定義類型,該種類型定義的變量也包含一系列的成員,特征是這些成員共用同一塊空間,所以聯合體也被稱為共用體。
代碼如下(示例):
#include<stdio.h> union Un//聯合類型的聲明,union是聯合體關鍵字 { char c;//1字節 int i;//4字節 }; int main() { union Un u = {0}; printf("%d\n", sizeof(u)); printf("%p\n", &u); printf("%p\n", &(u.c));//u.c表示聯合體的成員c,該引用方法類似結構體 printf("%p\n", &(u.i)); }
打印結果如下:
由sizeof(u)我們知道這個聯合體總計占4個字節,而聯合體成員i是int類型的,它占了4個字節,另外一個c是char類型占了1個字節,兩個一起占了4個字節。說明c和i必然有一處是共用一塊空間的,再者有u本身和它的兩個成員是一個地址如上圖003EFA80,說明首地址是重合的,簡易示圖如下:
由于共用空間這種特點就導致了,你改變c,i也會隨之改變。這里和結構體是完全不一樣的,結構體成員相互獨立,但聯合體不一樣,改一個,其他的也會改變。所以這里,在同一時間,你只能使用一個聯合體成員,你使用c就不要用i,因為你c改變的時候,一定會影響到你i的使用,程序非常容易出問題。
聯合的成員是共用一塊內存空間的,這樣一個聯合變量的大小,至少是最大成員的大小(因為聯合)
我們再來看看聯合體在解決判斷內存存儲是大端存儲還是小端存儲的優勢
代碼如下(示例):
union U { char c; int i; }u;//聯合體變量創建方法類比結構體 int main() { u.i = 1; //0x 00 00 00 01 //低地址-------->高地址 //01 00 00 00 小端存儲 低位放低地址 //00 00 00 01 大端存儲 低位放高地址 if (u.c == 1) { printf("小端"); } else { printf("大端"); } }
由于i和c是共用一塊內存,我們創建了i之后只要判斷1是在高地址還是低地址即可,又因為c是和i是一個地址(低),所以只要判斷c里面放的是1還是0即可,非常的方便。
在計算聯合體大小之前我們必須知道兩個知識點:
1.聯合的大小至少是最大成員的大小
2.當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。
舉例說明:
#include<stdio.h> union Un1 { char c[5];//1個char類型占1字節,5個占5字節 int i;//4字節 }; union Un2 { short c[7];//1個short類型占2字節,7個占14字節 int i;//4字節 }; int main() { printf("%d\n", sizeof(union Un1));//打印8 printf("%d\n", sizeof(union Un2));//打印16 }
Un1解釋:
char創建一個大小為5的數組和放5個char類型的是一樣道理,對齊數仍然是1
int類型的i自身大小4字節,默認對齊數8,對齊數是4。i和c兩個最大的對齊數是4,而最大成員大小是數組c(5個字節),5不是4的倍數,我們需要對齊到最大對齊數的整數倍,也就是8(從5到8會浪費3個字節空間)
Un2解釋:
short創建的c數組,我們同上可知其c對齊數是2,i對齊數是4,最大對齊數為4。最大成員大小也就是c數組大小為14,14并不是最大對齊數4的整數倍,14往上對齊到16,16是4的整數倍。
到此,關于“如何掌握C語言聯合體Union特點及運用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。