溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何掌握C語言聯(lián)合體Union特點(diǎn)及運(yùn)用

發(fā)布時間:2021-10-22 17:32:06 來源:億速云 閱讀:140 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“如何掌握C語言聯(lián)合體Union特點(diǎn)及運(yùn)用”,在日常操作中,相信很多人在如何掌握C語言聯(lián)合體Union特點(diǎn)及運(yùn)用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何掌握C語言聯(lián)合體Union特點(diǎn)及運(yùn)用”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

一、聯(lián)合(共用體)定義

聯(lián)合是一種特殊的自定義類型,該種類型定義的變量也包含一系列的成員,特征是這些成員共用同一塊空間,所以聯(lián)合體也被稱為共用體。

代碼如下(示例):

#include<stdio.h>
union Un//聯(lián)合類型的聲明,union是聯(lián)合體關(guān)鍵字
{
	char c;//1字節(jié)
	int i;//4字節(jié)
};
int main()
{
	union Un u = {0};
	printf("%d\n", sizeof(u));
	printf("%p\n", &u);
	printf("%p\n", &(u.c));//u.c表示聯(lián)合體的成員c,該引用方法類似結(jié)構(gòu)體
	printf("%p\n", &(u.i));
}

打印結(jié)果如下:

如何掌握C語言聯(lián)合體Union特點(diǎn)及運(yùn)用

由sizeof(u)我們知道這個聯(lián)合體總計占4個字節(jié),而聯(lián)合體成員i是int類型的,它占了4個字節(jié),另外一個c是char類型占了1個字節(jié),兩個一起占了4個字節(jié)。說明c和i必然有一處是共用一塊空間的,再者有u本身和它的兩個成員是一個地址如上圖003EFA80,說明首地址是重合的,簡易示圖如下:

如何掌握C語言聯(lián)合體Union特點(diǎn)及運(yùn)用

由于共用空間這種特點(diǎn)就導(dǎo)致了,你改變c,i也會隨之改變。這里和結(jié)構(gòu)體是完全不一樣的,結(jié)構(gòu)體成員相互獨(dú)立,但聯(lián)合體不一樣,改一個,其他的也會改變。所以這里,在同一時間,你只能使用一個聯(lián)合體成員,你使用c就不要用i,因?yàn)槟鉩改變的時候,一定會影響到你i的使用,程序非常容易出問題。

二、聯(lián)合的特點(diǎn)及運(yùn)用

聯(lián)合的成員是共用一塊內(nèi)存空間的,這樣一個聯(lián)合變量的大小,至少是最大成員的大?。ㄒ?yàn)槁?lián)合)

我們再來看看聯(lián)合體在解決判斷內(nèi)存存儲是大端存儲還是小端存儲的優(yōu)勢
代碼如下(示例):

union U
{
	char c;
	int i;
}u;//聯(lián)合體變量創(chuàng)建方法類比結(jié)構(gò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是共用一塊內(nèi)存,我們創(chuàng)建了i之后只要判斷1是在高地址還是低地址即可,又因?yàn)閏是和i是一個地址(低),所以只要判斷c里面放的是1還是0即可,非常的方便。

三、聯(lián)合的大小計算

在計算聯(lián)合體大小之前我們必須知道兩個知識點(diǎn):
1.聯(lián)合的大小至少是最大成員的大小
2.當(dāng)最大成員大小不是最大對齊數(shù)的整數(shù)倍的時候,就要對齊到最大對齊數(shù)的整數(shù)倍。

舉例說明:

#include<stdio.h>
union Un1
{
	char c[5];//1個char類型占1字節(jié),5個占5字節(jié)
	int i;//4字節(jié)
};
union Un2
{
	short c[7];//1個short類型占2字節(jié),7個占14字節(jié)
	int i;//4字節(jié)
};
int main()
{
	printf("%d\n", sizeof(union Un1));//打印8
	printf("%d\n", sizeof(union Un2));//打印16
}

Un1解釋:

char創(chuàng)建一個大小為5的數(shù)組和放5個char類型的是一樣道理,對齊數(shù)仍然是1
int類型的i自身大小4字節(jié),默認(rèn)對齊數(shù)8,對齊數(shù)是4。i和c兩個最大的對齊數(shù)是4,而最大成員大小是數(shù)組c(5個字節(jié)),5不是4的倍數(shù),我們需要對齊到最大對齊數(shù)的整數(shù)倍,也就是8(從5到8會浪費(fèi)3個字節(jié)空間)

Un2解釋:

short創(chuàng)建的c數(shù)組,我們同上可知其c對齊數(shù)是2,i對齊數(shù)是4,最大對齊數(shù)為4。最大成員大小也就是c數(shù)組大小為14,14并不是最大對齊數(shù)4的整數(shù)倍,14往上對齊到16,16是4的整數(shù)倍。

到此,關(guān)于“如何掌握C語言聯(lián)合體Union特點(diǎn)及運(yùn)用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI