欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言聯(lián)合體Union特點(diǎn)及運(yùn)用全面講解教程

 更新時(shí)間:2021年10月22日 15:26:52   作者:高郵吳少  
這篇文章主要為大家介紹了C語言聯(lián)合體Union特點(diǎn)及運(yùn)用的全面講解教程有需要深度朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪

前言

上一期C語言快速入門我們學(xué)習(xí)了枚舉類型及相關(guān)知識點(diǎn)

這期我們來跟著筆者學(xué)習(xí)一下聯(lián)合體相關(guān)知識,相信聰明的你一定會有所收獲!

提示:以下是本篇文章正文內(nèi)容,下面案例可供參考

一、聯(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é)果如下:

在這里插入圖片描述

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

在這里插入圖片描述

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

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

聯(lián)合的成員是共用一塊內(nèi)存空間的,這樣一個(gè)聯(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是一個(gè)地址(低),所以只要判斷c里面放的是1還是0即可,非常的方便。

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

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

舉例說明:

#include<stdio.h>
union Un1
{
	char c[5];//1個(gè)char類型占1字節(jié),5個(gè)占5字節(jié)
	int i;//4字節(jié)
};
union Un2
{
	short c[7];//1個(gè)short類型占2字節(jié),7個(gè)占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)建一個(gè)大小為5的數(shù)組和放5個(gè)char類型的是一樣道理,對齊數(shù)仍然是1
int類型的i自身大小4字節(jié),默認(rèn)對齊數(shù)8,對齊數(shù)是4。i和c兩個(gè)最大的對齊數(shù)是4,而最大成員大小是數(shù)組c(5個(gè)字節(jié)),5不是4的倍數(shù),我們需要對齊到最大對齊數(shù)的整數(shù)倍,也就是8(從5到8會浪費(fèi)3個(gè)字節(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ù)倍。

總結(jié)

本文介紹了聯(lián)合體的定義、特點(diǎn)及使用、還有聯(lián)合體大小的相關(guān)計(jì)算,相信認(rèn)真學(xué)習(xí)的你一定會有所收獲,期待你的關(guān)注,加快筆者更新速度嘿嘿。

以上就是C語言聯(lián)合體Union特點(diǎn)及運(yùn)用全面講解教程的詳細(xì)內(nèi)容,更多關(guān)于C語言聯(lián)合體Union教程的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++多重繼承引發(fā)的重復(fù)調(diào)用問題與解決方法

    C++多重繼承引發(fā)的重復(fù)調(diào)用問題與解決方法

    這篇文章主要介紹了C++多重繼承引發(fā)的重復(fù)調(diào)用問題與解決方法,結(jié)合具體實(shí)例形式分析了C++多重調(diào)用中的重復(fù)調(diào)用問題及相應(yīng)的解決方法,需要的朋友可以參考下
    2018-05-05
  • C/C++?Qt?給ListWidget組件增加右鍵菜單功能

    C/C++?Qt?給ListWidget組件增加右鍵菜單功能

    本篇文章給大家介紹ListWidget組件增加一個(gè)右鍵菜單,當(dāng)用戶在ListWidget組件中的任意一個(gè)子項(xiàng)下右鍵,我們讓其彈出這個(gè)菜單,并根據(jù)選擇提供不同的功能,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • 華為筆試算法題匯總

    華為筆試算法題匯總

    這篇文章主要為大家匯總了華為筆試算法題,每一題都給出了詳細(xì)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • C語言示例講解動態(tài)/文件/靜態(tài)功能版本的通訊錄實(shí)現(xiàn)

    C語言示例講解動態(tài)/文件/靜態(tài)功能版本的通訊錄實(shí)現(xiàn)

    通訊錄是一個(gè)可以記錄親人、好友信息的工具,這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)通訊錄管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Opencv實(shí)現(xiàn)最小外接矩形和圓

    Opencv實(shí)現(xiàn)最小外接矩形和圓

    這篇文章主要為大家詳細(xì)介紹了Opencv實(shí)現(xiàn)最小外接矩形和圓,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • QT實(shí)現(xiàn)用戶登錄注冊

    QT實(shí)現(xiàn)用戶登錄注冊

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)用戶登錄注冊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 用c++實(shí)現(xiàn)x的y次冪的代碼

    用c++實(shí)現(xiàn)x的y次冪的代碼

    以下實(shí)例是對使用c++實(shí)現(xiàn)x的y次冪的解決方法進(jìn)行了介紹。需要的朋友參考下
    2013-05-05
  • 利用Matlab實(shí)現(xiàn)時(shí)域分析功能的示例詳解

    利用Matlab實(shí)現(xiàn)時(shí)域分析功能的示例詳解

    利用MATLAB可以方便地進(jìn)行控制系統(tǒng)的時(shí)域分析。這篇文章主要通過簡單的示例為大家介紹了Matlab進(jìn)行時(shí)域分析的具體操作,需要的可以參考一下
    2023-02-02
  • C++ namespace案例詳解

    C++ namespace案例詳解

    這篇文章主要介紹了C++ namespace案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 圖的鄰接表存儲表示示例講解

    圖的鄰接表存儲表示示例講解

    這篇文章主要介紹了圖的鄰接表存儲表示,大家參考使用
    2013-11-11

最新評論