C語言聯(lián)合體類型的實現(xiàn)
一,什么是聯(lián)合體
聯(lián)合體也稱共用體
像結構體一樣,聯(lián)合體也是由一個或者多個成員構成,這些成員的類型可以不同。但是,與結構體不同的是:聯(lián)合體的所有成員共用一塊內(nèi)存空間。(即:給聯(lián)合體其中的一個成員賦值,其他成員的值也會跟著被改變)
二,聯(lián)合體的聲明
1,聯(lián)合體類型的聲明
C語言中聯(lián)合體類型的定義形式:
union 聯(lián)合體名 { 成員項表列 };
例如:
(我們定義一個同時由char和int型構成的聯(lián)合體)
union Un { char c; int i; }; (注意:分號不能丟)
2,聯(lián)合體變量的創(chuàng)建
同結構體變量的創(chuàng)建類似,我們可以在聲明聯(lián)合體類型的同時創(chuàng)建變量;也可以在聲明后,再創(chuàng)建變量
如:
(1)先聲明聯(lián)合體類型,再創(chuàng)建變量
#include<stdio.h> union Un { char c; int i; }; union Un u1;
(2)在聲明聯(lián)合體類型的同時創(chuàng)建變量
union Un { char c; int i; }u1;
對聯(lián)合體成員的引用也與對結構體成員的引用相同
三,聯(lián)合體的特點
1,聯(lián)合體與結構體的對比
聯(lián)合體的大部分與結構體相似,其獨特之處就是所有成員共用一塊內(nèi)存空間
例如,我們看擁有相同成員的結構體和聯(lián)合體對比:
對于s1 和 u1的內(nèi)存分配情況應該是:
我們可以用sizeof
算一算,看看結果:
運行下面代碼:
int main() { printf("%d\n", sizeof(s1)); printf("%d\n", sizeof(u1)); return 0; }
輸出:
可以發(fā)現(xiàn):和我們上面的分析一樣
2,對聯(lián)合體成員進行改變
下面我們就對聯(lián)合體u1
中的成員c
進行賦值,然后再打印成員i
#include<stdio.h> union Un { char c; int i; }u1; int main() { u1.c = 1; printf("%d", u1.i); return 0; }
運行結果:
可見:盡管沒有給成員i
賦值,但是隨著成員c
被修改成員i
的值也發(fā)生了變化
四,聯(lián)合體的大小
上面提到的聯(lián)合體u1
的大小是4,剛好是當中最大的int
類型的大小,難道聯(lián)合體的大小就是其中最大成員的大小嗎?
答案是:錯誤的
因為聯(lián)合體的大小也要滿足是最大對齊數(shù)的整數(shù)倍
?換句話來說,聯(lián)合體的大小要滿足以下兩個條件:
1,大于或等于最大的成員(至少要能裝下最大的成員)
2,同時是最大對齊數(shù)的整數(shù)倍
對于上面的u1
:
最大成員:int
類型的大小是4
而int
的最大對齊數(shù)也是4,所以聯(lián)合體u1
的大小是4
再看下面的代碼(多加一個字符數(shù)組):
#include<stdio.h> union Un { char c; int i; char arr[6]; }u1; int main() { u1.c = 1; printf("%d",sizeof(u1)); return 0; }
運行結果:
這是因為:
1,最大成員char arr[6]
的大小是6
2,最大對齊數(shù)是4
6不是4的倍數(shù),所以擴寬到8,所以聯(lián)合體的大小是8
到此這篇關于C語言聯(lián)合體類型的實現(xiàn)的文章就介紹到這了,更多相關C語言聯(lián)合體類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言使用ffmpeg實現(xiàn)單線程異步的視頻播放器
這篇文章主要為大家詳細介紹了C語言如何使用ffmpeg實現(xiàn)單線程異步的視頻播放器功能,文中的示例代碼講解詳細,感興趣的小伙伴可以嘗試一下2022-12-12Ubuntu18.04下QT開發(fā)Android無法連接設備問題解決實現(xiàn)
本文主要介紹了Ubuntu18.04下QT開發(fā)Android無法連接設備問題解決實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06