最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言枚舉與聯(lián)合體深入詳解

 更新時(shí)間:2022年09月20日 09:37:56   作者:白朝槿kk  
枚舉顧名思義就是把所有的可能性列舉出來,像一個(gè)星期分為七天我們就可以使用枚舉,聯(lián)合體是由關(guān)鍵字union和標(biāo)簽定義的,和枚舉是一樣的定義方式,不一樣的是,一個(gè)聯(lián)合體只有一塊內(nèi)存空間,什么意思呢,就相當(dāng)于只開辟最大的變量的內(nèi)存,其他的變量都在那個(gè)變量占據(jù)空間

前言

在C語言中,有三個(gè)自定義類型——結(jié)構(gòu)體,枚舉,聯(lián)合,自定義類型出現(xiàn)是為了解決內(nèi)置類型無法解決的問題。例如人這個(gè)對(duì)象,如果要描述人這樣一個(gè)復(fù)雜對(duì)象,就不只是一個(gè)簡簡單單的int、char、double類型的數(shù)據(jù)能描述的,這時(shí)候就需要我們使用自定義類型來描述。

(PS:內(nèi)置類型是指任何語言在設(shè)計(jì)初期定義的類型,如c語言中的int, double, char… 它也是在一種語言中最基本的類型,與編譯器編譯出的代碼具有重大關(guān)系,值得一提的是,不同語言也擁有不同的內(nèi)置類型,但是所有內(nèi)置類型的定義都與計(jì)算機(jī)的運(yùn)算方式相關(guān)。)

對(duì)于結(jié)構(gòu)體來說,我們應(yīng)該都不陌生,結(jié)構(gòu)體很重要,內(nèi)容也很多,我之前寫過一篇關(guān)于結(jié)構(gòu)體的文章,不過那篇文章寫的都是結(jié)構(gòu)體的一些基礎(chǔ)內(nèi)容,過兩天會(huì)寫一篇進(jìn)階的,所以現(xiàn)在在就先不講結(jié)構(gòu)體了,我們先認(rèn)識(shí)一下另外兩個(gè)自定義類型。

枚舉

枚舉的定義

枚舉類型的定義要使用enum關(guān)鍵字,舉個(gè)例子,如果我要用枚舉常量才定義一下三原色,也就是紅藍(lán)綠(RGB)。請(qǐng)看下面這段代碼:

enum Color
{
	//枚舉常量
	RED,
	GREEN,
	BLUE
};

Color就被定義成了枚舉類型,{}中的內(nèi)容是枚舉類型的可能取值,也就是枚舉常量。(補(bǔ)充:對(duì)于#define和嗎枚舉定義的常量 一般把變量名寫成大寫)。

枚舉的使用

如果要用枚舉類型創(chuàng)建變量就要使用enum Color,enum Color就代表著枚舉類型,而創(chuàng)建好的變量的值就只能是{}中的內(nèi)容。如下:

	enum Color a = RED;
	enum Color b = GREEN;
	enum Color c = BLUE;

枚舉常量是不能改變的。但是這些枚舉常量都是有值的,默認(rèn)從0開始,一次遞增1,當(dāng)然在定義的時(shí)候也可以賦初值。給大家解釋一下,看下面這段代碼:

	printf("%d\n", RED);
	printf("%d\n", GREEN);
	printf("%d\n", BLUE);

我想看到這大家應(yīng)該明白這是什么意思了,枚舉常量是有值的,數(shù)值從0開始依次加1。如果要改變初始的值,只需要給第一個(gè)枚舉常量賦值就行。例如:

enum Color
{
	//枚舉常量
	RED = 2,
	GREEN,
	BLUE
};

像這樣,再去打印RED,GREEN和BLUE,值就是2,3,4。

枚舉的優(yōu)點(diǎn)

對(duì)于枚舉,我們可以使用 #define 定義常量,為什么非要使用枚舉?

枚舉的優(yōu)點(diǎn):

  • 增加代碼的可讀性和可維護(hù)性
  • 和#define定義的標(biāo)識(shí)符比較枚舉有類型檢查,更加嚴(yán)謹(jǐn)。
  • 防止了命名污染(封裝)
  • 便于調(diào)試
  • 使用方便,一次可以定義多個(gè)常量

聯(lián)合(共用體)

在進(jìn)行某些算法的C語言編程的時(shí)候,需要使幾種不同類型的變量存放到同一段內(nèi)存單元中。也就是使用覆蓋技術(shù),幾個(gè)變量互相覆蓋。這種幾個(gè)不同的變量共同占用一段內(nèi)存的結(jié)構(gòu),在C語言中,被稱作“共用體”類型結(jié)構(gòu),簡稱共用體,也叫聯(lián)合體。

聯(lián)合體的定義

聯(lián)合體的定義與結(jié)構(gòu)體比較相似,要先聲明聯(lián)合體,要使用union這個(gè)關(guān)鍵字,聲明方式如下:

union MyUnion
{
	int a;
	char b;
};

聯(lián)合體的定義如下:

//union 類型名 變量名
union MyUnion un;

這樣就創(chuàng)建好了un這個(gè)聯(lián)合體類型。

聯(lián)合體的特點(diǎn)

先看這段代碼以及運(yùn)行結(jié)果:

union MyUnion
{
	int a;//4
	char b;//1
};
int main()
{
	union MyUnion un;
	printf("%d\n", sizeof(un));
	printf("%u\n", &(un));
	printf("%u\n", &(un.a));
	printf("%u\n", &(un.b));
	return 0;
}

我們可以看到un的大小是4不是5,而且un,un.a和un.b的地址是一樣的。為什么?

下面我給大家一一解釋:

我們?cè)趧?chuàng)建變量時(shí),編譯器就會(huì)給我們開辟一些空間,因此我創(chuàng)建un變量時(shí),編譯器就已經(jīng)給我開辟空間了,那么我在打印un地址時(shí),打印的就是un的首地址。在64位環(huán)境下,int是4個(gè)字節(jié),char是一個(gè)字節(jié),它們的地址和un是一樣的,說明int是從un的首地址開始向后占用4個(gè)字節(jié)的空間,char也是從un的首地址開始的。因此打印出來的un.a和un.b的地址是相同的。它們公用同一部分的內(nèi)存空間,這就是聯(lián)合體。

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

1.聯(lián)合的大小至少是最大成員的大小。

2.當(dāng)最大成員大小不是最大對(duì)齊數(shù)的整數(shù)倍的時(shí)候,就要對(duì)齊到最大對(duì)齊數(shù)的整數(shù)倍。

對(duì)于第一條,上面的例子證明過了,接下來重點(diǎn)來看第二條??匆幌孪旅孢@段代碼:

union un
{
	char c[5];
	int i;
};
int main()
{
	printf("%d\n", sizeof(union un));
	return 0;
}

對(duì)于這段代碼,最后輸出的結(jié)果是什么?5?

答案是8.

為什么?

對(duì)于un里面有一個(gè)長度為5的字符數(shù)組c和一個(gè)整型i。我們可以把它看成5個(gè)字符變量和一個(gè)整型變量。那么在計(jì)算聯(lián)合體大小的時(shí)候,對(duì)齊數(shù)就是int類型,也就是4個(gè)字節(jié),而不是5個(gè)字節(jié)。

因此我們計(jì)算聯(lián)合體大小,考慮以多少字節(jié)為對(duì)齊數(shù)時(shí),就只需要看數(shù)據(jù)類型就可以了,然后再看多少最大對(duì)齊數(shù)的整數(shù)倍能放下最大的變量就可以了。

總結(jié)

自定義類型中枚舉和聯(lián)合體的難度不是很大,也就聯(lián)合體大小的計(jì)算有點(diǎn)難度。大家只要記住計(jì)算聯(lián)合體大小的兩個(gè)特點(diǎn)就可以了。(感謝您的觀看,如有錯(cuò)誤,歡迎指正!感謝!)

到此這篇關(guān)于C語言枚舉與聯(lián)合體深入詳解的文章就介紹到這了,更多相關(guān)C語言枚舉與聯(lián)合體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 推薦幾款實(shí)用的C++ 在線工具

    推薦幾款實(shí)用的C++ 在線工具

    這篇文章主要推薦了幾款實(shí)用的C++ 在線工具,幫助大家更好的進(jìn)行c++開發(fā),感興趣的朋友可以了解下載。
    2020-10-10
  • MFC實(shí)現(xiàn)連連看游戲之地圖顯示

    MFC實(shí)現(xiàn)連連看游戲之地圖顯示

    這篇文章主要為大家詳細(xì)介紹了MFC實(shí)現(xiàn)連連看游戲之地圖顯示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C語言實(shí)現(xiàn)超市管理系統(tǒng)

    C語言實(shí)現(xiàn)超市管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)超市管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言并查集的非遞歸實(shí)現(xiàn)詳解

    C語言并查集的非遞歸實(shí)現(xiàn)詳解

    以下是對(duì)C語言并查集的遞歸實(shí)現(xiàn)與非遞歸實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望能夠給你帶來幫助
    2021-09-09
  • C++右值引用與移動(dòng)構(gòu)造函數(shù)基礎(chǔ)與應(yīng)用詳解

    C++右值引用與移動(dòng)構(gòu)造函數(shù)基礎(chǔ)與應(yīng)用詳解

    左值和右值都是針對(duì)表達(dá)式,左值是指表達(dá)式結(jié)束后依然存在的持久對(duì)象,右值是指表達(dá)式結(jié)束時(shí)就不再存在的臨時(shí)對(duì)象,下面這篇文章主要給大家介紹了關(guān)于C++11右值引用和移動(dòng)語義的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • c++中c_str()的用法示例

    c++中c_str()的用法示例

    這篇文章主要介紹了c++中c_str()的用法示例,幫助大家更好的理解和學(xué)習(xí)C++,感興趣的朋友可以了解下
    2020-09-09
  • C語言實(shí)現(xiàn)飛機(jī)訂票系統(tǒng)的完整代碼

    C語言實(shí)現(xiàn)飛機(jī)訂票系統(tǒng)的完整代碼

    為了免去在窗口排隊(duì)買票的麻煩,飛機(jī)訂票系統(tǒng)應(yīng)運(yùn)而生,下面這篇文章主要給大家介紹了關(guān)于C語言實(shí)現(xiàn)飛機(jī)訂票系統(tǒng)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • C語言實(shí)現(xiàn)掃雷游戲小項(xiàng)目

    C語言實(shí)現(xiàn)掃雷游戲小項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)掃雷游戲小項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++智能指針讀書筆記

    C++智能指針讀書筆記

    本篇隨筆僅作為個(gè)人學(xué)習(xí)《C++ Primer》智能指針一節(jié)后的部分小結(jié),抄書嚴(yán)重,伴隨個(gè)人理解。主要介紹shared_ptr、make_shared、weak_ptr的用法和聯(lián)系
    2015-11-11
  • windows系統(tǒng)下C++調(diào)用matlab程序的方法詳解

    windows系統(tǒng)下C++調(diào)用matlab程序的方法詳解

    這篇文章主要給大家介紹了關(guān)于在windows系統(tǒng)下C++調(diào)用matlab程序的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08

最新評(píng)論

兴隆县| 南澳县| 原阳县| 岳普湖县| 南溪县| 沙河市| 雷州市| 巴林右旗| 枝江市| 横峰县| 开阳县| 钟山县| 长葛市| 黎平县| 沂南县| 玉屏| 双柏县| 宜都市| 安岳县| 吉林市| 合水县| 安顺市| 濮阳县| 赣州市| 白山市| 鄂伦春自治旗| 山丹县| 德州市| 东乡县| 芦溪县| 怀安县| 马公市| 株洲县| 潜山县| 海宁市| 高密市| 浙江省| 遵义县| 望都县| 北海市| 前郭尔|