C語(yǔ)言關(guān)于自定義數(shù)據(jù)類(lèi)型之枚舉和聯(lián)合體詳解
前言
在C語(yǔ)言的自定義數(shù)據(jù)類(lèi)型中,除了我們最為常用的結(jié)構(gòu)體之外,還有兩個(gè)比較少用的自定義數(shù)據(jù)類(lèi)型,分別為枚舉和聯(lián)合體(也可以稱為共用體)。
今天,我們一起看學(xué)習(xí)一下相關(guān)的知識(shí)吧!

枚舉
什么是枚舉?
顧名思義,就是一一列舉,把所有的情況,所有的取值,一一列舉出來(lái)。
在我們生活中,有不少的東西是可以全部列舉出來(lái)的。
如一個(gè)星期有七天,一年有十二個(gè)月,性別有男和女,評(píng)價(jià)有優(yōu)秀、良好、及格和不及格等等。
當(dāng)某些數(shù)據(jù)的值只有固定的幾種可能取值的時(shí)候,我們就可以使用枚舉類(lèi)型。
枚舉類(lèi)型的定義
enum 枚舉類(lèi)型名 { 枚舉值1 ,枚舉值2,… ,枚舉值n };
枚舉類(lèi)型的定義和結(jié)構(gòu)體類(lèi)似,先使用enum這個(gè)關(guān)鍵字,后面加上枚舉類(lèi)型的名字,括號(hào)內(nèi)是枚舉的值,最后別忘記分號(hào)。
還有,最后的一個(gè)枚舉值后面不需要逗號(hào)!
一般定義枚舉類(lèi)型的方法如下:
注意:這是定義枚舉類(lèi)型,而不是定義枚舉變量!
例如如下:
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex//性別
{
MALE,
FEMALE,
SECRET
};
enum Color//顏色
{
RED,
GREEN,
BLUE
};
此外,還有其他的一些定義的方法。
枚舉類(lèi)型的優(yōu)點(diǎn)
那么我們來(lái)思考一個(gè)問(wèn)題,為什么需要枚舉呢?
我們其實(shí)可以通過(guò)#define的方式來(lái)定義常量,那么我們還需要定義枚舉嗎?
其實(shí)是需要的。
在有些情況下,枚舉可以讓我們的代碼更加清晰明了。
比如,我們?cè)谛枰蛴〔藛蔚臅r(shí)候,就需要有不同的選項(xiàng),那么每一個(gè)選項(xiàng)就對(duì)應(yīng)一個(gè)值,那么我們可以使用枚舉讓數(shù)值與對(duì)應(yīng)的含義對(duì)上號(hào),那么這就可以讓我們?cè)趯?shí)現(xiàn)每一個(gè)具體的細(xì)節(jié)的時(shí)候,知道這一種case情況對(duì)應(yīng)的具體含義。
此外,還有別的優(yōu)點(diǎn):
- 防止了命名污染(封裝)
- 便于調(diào)試
- 使用方便,一次可以定義多個(gè)常量
枚舉類(lèi)型的使用
通過(guò)枚舉類(lèi)型,我們可以定義枚舉變量
enum Color//顏色
{
RED,
GREEN,
BLUE
};
//使用方法和其他類(lèi)型一直,就像int a;一樣
enum Color clr;
//使用枚舉值來(lái)給枚舉類(lèi)型賦值
clr = RED;
//注意,一般我們給枚舉賦值的時(shí)候,都用枚舉值,而不用其他的值,否則就沒(méi)有什么意義了
我們一般使用結(jié)構(gòu)體的時(shí)候,都像上面的栗子一樣。
先創(chuàng)建好枚舉的模板,燃用這個(gè)模板來(lái)創(chuàng)建變量。
此外,還有其他的方法:
創(chuàng)建模板的同時(shí)定義枚舉變量
enum Color//顏色
{
RED,
GREEN,
BLUE
}clr1,clr2;//在最后這里,我們定義了兩個(gè)枚舉變量
省略枚舉類(lèi)型名字,匿名創(chuàng)建枚舉變量
enum
{
RED,
GREEN,
BLUE
}clr1,clr2;//這里定義了兩個(gè)枚舉變量
上面的兩個(gè)變量依舊可以使用,只是,我們沒(méi)有寫(xiě)出該枚舉類(lèi)型的名字,就只能這樣來(lái)定義變量,以后不能在利用這個(gè)模板來(lái)創(chuàng)建變量了
使用typedef來(lái)給枚舉類(lèi)型重命名
typedef enum Color//顏色
{
RED,
GREEN,
BLUE
}cr;//注意,這里的cr是新的枚舉類(lèi)型名字,不是定義的枚舉變量
//還可以匿名重命名
typedef enum
{
RED,
GREEN,
BLUE
}cr;
枚舉中需要注意的點(diǎn)
- 枚舉值只能是整型的數(shù)據(jù),如字符、整數(shù)等,不能是浮點(diǎn)型
- 枚舉類(lèi)型變量賦值的時(shí)候,一般用枚舉值來(lái)賦值,不適用其他的數(shù)值來(lái)賦值
- 枚舉值本身是一個(gè)常量,我們可以對(duì)枚舉變量的值進(jìn)行修改,但不能對(duì)枚舉值進(jìn)行修改
- 枚舉值被處理的時(shí)候,會(huì)被看成整數(shù)數(shù)值,因此枚舉變量可以算術(shù)運(yùn)算、關(guān)系運(yùn)算等
聯(lián)合體
聯(lián)合體類(lèi)型的定義
union 聯(lián)合體類(lèi)型名 { 數(shù)據(jù)類(lèi)型 成員名1 , 數(shù)據(jù)類(lèi)型 成員名 2 , … , 數(shù)據(jù)類(lèi)型 成員名n;};
聯(lián)合體也叫共用體,這個(gè)也是一種特殊的數(shù)據(jù)類(lèi)型。
這種類(lèi)型定義的變量也包含一系列的成員,特征是這些成員公用同一塊空間。
栗子如下:
union Un
{
char c;
int i;
};
聯(lián)合體的特點(diǎn)
聯(lián)合體變量的成員是使用共同的一塊空間的。
聯(lián)合體的大小,至少是成員中最大成員的大小。
(這里的至少我們后面再說(shuō))
#include<stdio.h>
union Un
{
int i;
char c;
};
union Un un;
int main() {
// 下面輸出的結(jié)果是一樣的嗎?
printf("%p\n", &un);
printf("%p\n", &(un.i));
printf("%p\n", &(un.c));
return 0;
}
運(yùn)行上面的代碼,我們會(huì)發(fā)現(xiàn)三個(gè)地址都相同

成員變量i是第一個(gè)成員,該地址和聯(lián)合體的地址相同我們可以理解,c作為第二個(gè)成員變量,其地址也是和第一個(gè)成員變量的地址相同,那么這就說(shuō)明,它們確實(shí)使用的是同一塊空間
聯(lián)合體的使用
聯(lián)合體類(lèi)型定義變量的方法,和結(jié)構(gòu)體、枚舉類(lèi)似,都有多種方法
先創(chuàng)建模板,在定義變量
union Un
{
int i;
char c;
};
union Un un;
創(chuàng)建模板的同時(shí)定義變量
union Un
{
int i;
char c;
}un;//此處的un是一個(gè)聯(lián)合體變量
匿名定義聯(lián)合體變量
union
{
int i;
char c;
}un;//此處的un是一個(gè)聯(lián)合體變量
同樣的,由于聯(lián)合體類(lèi)型名的省略,我們只可以這樣來(lái)定義變量,后面就再也不能使用該模板來(lái)定義變量了
typedef重命名聯(lián)合體類(lèi)型名
typedef union Un
{
int i;
char c;
}un;
typedef union
{
int i;
char c;
}un;
聯(lián)合體存在內(nèi)存對(duì)齊
上面說(shuō)到,聯(lián)合體的大小,至少是最大成員變量的大小。為什么是至少呢?
我們先來(lái)看下面的栗子:
union Un
{
char arr[6];
short s;
};
union Un u;
int main() {
// 下面輸出的結(jié)果是一樣的嗎?
printf("%u", sizeof(union Un));
return 0;
}
上面的代碼輸出的結(jié)果為6
如果我們把字符數(shù)組的大小改成5,會(huì)發(fā)現(xiàn)大小還是6
這是因?yàn)椋?lián)合體中也存在著對(duì)齊
上面的栗子中,會(huì)認(rèn)為字符數(shù)組的默認(rèn)對(duì)齊數(shù)為1,而short的默認(rèn)對(duì)其數(shù)位2,但是成員變量的大小會(huì)根據(jù)數(shù)組的大小來(lái)計(jì)算,而不是根據(jù)數(shù)組的元素類(lèi)型。假如你是元素個(gè)數(shù)為6的字符數(shù)組,那么大小就是6,元素個(gè)數(shù)為5的字符數(shù)組,大小就是5,而int、short等數(shù)據(jù)類(lèi)型就按照默認(rèn)的大小來(lái)計(jì)算。
首先需要聯(lián)合體的大小至少是最大成員變量的大小。
然后要求大小應(yīng)該為各個(gè)成員變量中,最大對(duì)齊數(shù)的倍數(shù),如果不是倍數(shù),那么對(duì)齊到整數(shù)倍處。
這就能說(shuō)明,為什么上面的代碼把字符數(shù)組的大小改為5個(gè)元素的時(shí)候,聯(lián)合體的大小仍然為6.
結(jié)語(yǔ)
今天的分享到這里就結(jié)束啦!
由于本人能力有限,難免會(huì)有出錯(cuò)的地方,還希望各位能夠指出!
希望各位能給我點(diǎn)個(gè)贊、點(diǎn)個(gè)收藏哦~
謝謝支持!

到此這篇關(guān)于C語(yǔ)言關(guān)于自定義數(shù)據(jù)類(lèi)型之枚舉和聯(lián)合體詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言 自定義數(shù)據(jù)類(lèi)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言編程中的聯(lián)合體union入門(mén)學(xué)習(xí)教程
- C語(yǔ)言中聯(lián)合體union的實(shí)例詳解
- C語(yǔ)言中枚舉與聯(lián)合體的使用方法(enum union)
- C語(yǔ)言結(jié)構(gòu)體,枚舉,聯(lián)合體詳解
- C語(yǔ)言超詳細(xì)講解結(jié)構(gòu)體與聯(lián)合體的使用
- C語(yǔ)言枚舉與聯(lián)合體深入詳解
- C語(yǔ)言中聯(lián)合體與共用體和枚舉使用語(yǔ)法示例
- c語(yǔ)言中聯(lián)合體和枚舉用法詳解
- C語(yǔ)言聯(lián)合體類(lèi)型的實(shí)現(xiàn)
- 一文帶你認(rèn)識(shí)C語(yǔ)言的聯(lián)合體和枚舉
- C語(yǔ)言聯(lián)合體的實(shí)現(xiàn)示例
相關(guān)文章
一問(wèn)學(xué)會(huì)QT時(shí)間類(lèi)
QT獲取時(shí)間的類(lèi)有3個(gè),分別是QDate、QTime、QDateTime,他們屬于QT的network模塊。本文詳細(xì)的介紹了這3個(gè)模塊的使用,感興趣的可以了解一下2023-04-04
利用C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲
這篇文章主要為大家詳細(xì)介紹了利用C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02
Qt實(shí)現(xiàn)編輯數(shù)據(jù)庫(kù)數(shù)據(jù)的方法詳解
這篇文章主要為大家詳細(xì)介紹了Qt是如何實(shí)現(xiàn)編輯數(shù)據(jù)庫(kù)數(shù)據(jù)的,文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們深入了解QT有一定的幫助,感興趣的小伙伴可以了解一下2023-02-02
rapidjson解析json代碼實(shí)例以及常見(jiàn)的json core dump問(wèn)題
今天小編就為大家分享一篇關(guān)于rapidjson解析json代碼實(shí)例以及常見(jiàn)的json core dump問(wèn)題,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之棧簡(jiǎn)單操作
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之棧簡(jiǎn)單操作的相關(guān)資料,需要的朋友可以參考下2017-06-06
深入c語(yǔ)言continue和break的區(qū)別詳解
本篇文章是對(duì)c語(yǔ)言中continue和break的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
詳解如何實(shí)現(xiàn)C++虛函數(shù)調(diào)用匯編代碼
多態(tài)是C++中最重要的特性之一,對(duì)虛函數(shù)的調(diào)用在C++代碼中是隨處可見(jiàn)的,本篇文章我們?cè)敿?xì)探討一下,感興趣的朋友快來(lái)看看吧2021-11-11

