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

C語言關(guān)于自定義數(shù)據(jù)類型之枚舉和聯(lián)合體詳解

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

前言

在C語言的自定義數(shù)據(jù)類型中,除了我們最為常用的結(jié)構(gòu)體之外,還有兩個(gè)比較少用的自定義數(shù)據(jù)類型,分別為枚舉和聯(lián)合體(也可以稱為共用體)。

今天,我們一起看學(xué)習(xí)一下相關(guān)的知識吧!

在這里插入圖片描述

枚舉

什么是枚舉?

顧名思義,就是一一列舉,把所有的情況,所有的取值,一一列舉出來。

在我們生活中,有不少的東西是可以全部列舉出來的。

如一個(gè)星期有七天,一年有十二個(gè)月,性別有男和女,評價(jià)有優(yōu)秀、良好、及格和不及格等等。

當(dāng)某些數(shù)據(jù)的值只有固定的幾種可能取值的時(shí)候,我們就可以使用枚舉類型。

枚舉類型的定義

enum 枚舉類型名 { 枚舉值1 ,枚舉值2,… ,枚舉值n };

枚舉類型的定義和結(jié)構(gòu)體類似,先使用enum這個(gè)關(guān)鍵字,后面加上枚舉類型的名字,括號內(nèi)是枚舉的值,最后別忘記分號。

還有,最后的一個(gè)枚舉值后面不需要逗號!

一般定義枚舉類型的方法如下:

注意:這是定義枚舉類型,而不是定義枚舉變量!

例如如下:

enum Day//星期
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};



enum Sex//性別
{
	MALE,
	FEMALE,
	SECRET
};


enum Color//顏色
{
	RED,
	GREEN,
	BLUE
};

此外,還有其他的一些定義的方法。

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

那么我們來思考一個(gè)問題,為什么需要枚舉呢?

我們其實(shí)可以通過#define的方式來定義常量,那么我們還需要定義枚舉嗎?

其實(shí)是需要的。

在有些情況下,枚舉可以讓我們的代碼更加清晰明了。

比如,我們在需要打印菜單的時(shí)候,就需要有不同的選項(xiàng),那么每一個(gè)選項(xiàng)就對應(yīng)一個(gè)值,那么我們可以使用枚舉讓數(shù)值與對應(yīng)的含義對上號,那么這就可以讓我們在實(shí)現(xiàn)每一個(gè)具體的細(xì)節(jié)的時(shí)候,知道這一種case情況對應(yīng)的具體含義。

此外,還有別的優(yōu)點(diǎn):

  • 防止了命名污染(封裝)
  • 便于調(diào)試
  • 使用方便,一次可以定義多個(gè)常量

枚舉類型的使用

通過枚舉類型,我們可以定義枚舉變量

enum Color//顏色
{
	RED,
	GREEN,
	BLUE
};


//使用方法和其他類型一直,就像int a;一樣
enum Color clr;

//使用枚舉值來給枚舉類型賦值
clr = RED;

//注意,一般我們給枚舉賦值的時(shí)候,都用枚舉值,而不用其他的值,否則就沒有什么意義了


我們一般使用結(jié)構(gòu)體的時(shí)候,都像上面的栗子一樣。

先創(chuàng)建好枚舉的模板,燃用這個(gè)模板來創(chuàng)建變量。

此外,還有其他的方法:

創(chuàng)建模板的同時(shí)定義枚舉變量

enum Color//顏色
{
	RED,
	GREEN,
	BLUE
}clr1,clr2;//在最后這里,我們定義了兩個(gè)枚舉變量

省略枚舉類型名字,匿名創(chuàng)建枚舉變量

enum 
{
	RED,
	GREEN,
	BLUE
}clr1,clr2;//這里定義了兩個(gè)枚舉變量

上面的兩個(gè)變量依舊可以使用,只是,我們沒有寫出該枚舉類型的名字,就只能這樣來定義變量,以后不能在利用這個(gè)模板來創(chuàng)建變量了

使用typedef來給枚舉類型重命名

typedef enum Color//顏色
{
	RED,
	GREEN,
	BLUE
}cr;//注意,這里的cr是新的枚舉類型名字,不是定義的枚舉變量



//還可以匿名重命名

typedef enum 
{
	RED,
	GREEN,
	BLUE
}cr;

枚舉中需要注意的點(diǎn)

  • 枚舉值只能是整型的數(shù)據(jù),如字符、整數(shù)等,不能是浮點(diǎn)型
  • 枚舉類型變量賦值的時(shí)候,一般用枚舉值來賦值,不適用其他的數(shù)值來賦值
  • 枚舉值本身是一個(gè)常量,我們可以對枚舉變量的值進(jìn)行修改,但不能對枚舉值進(jìn)行修改
  • 枚舉值被處理的時(shí)候,會(huì)被看成整數(shù)數(shù)值,因此枚舉變量可以算術(shù)運(yùn)算、關(guān)系運(yùn)算等

聯(lián)合體

聯(lián)合體類型的定義

union 聯(lián)合體類型名 { 數(shù)據(jù)類型 成員名1 , 數(shù)據(jù)類型 成員名 2 , … , 數(shù)據(jù)類型 成員名n;};

聯(lián)合體也叫共用體,這個(gè)也是一種特殊的數(shù)據(jù)類型。

這種類型定義的變量也包含一系列的成員,特征是這些成員公用同一塊空間。

栗子如下:

union Un
{
	char c;
	int i;
};

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

聯(lián)合體變量的成員是使用共同的一塊空間的。

聯(lián)合體的大小,至少是成員中最大成員的大小。
(這里的至少我們后面再說)

#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è)成員變量的地址相同,那么這就說明,它們確實(shí)使用的是同一塊空間

聯(lián)合體的使用

聯(lián)合體類型定義變量的方法,和結(jié)構(gòu)體、枚舉類似,都有多種方法

先創(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)合體類型名的省略,我們只可以這樣來定義變量,后面就再也不能使用該模板來定義變量了

typedef重命名聯(lián)合體類型名

typedef union Un
{
	int i;
	char c;
}un;


typedef union
{
	int i;
	char c;
}un;


聯(lián)合體存在內(nèi)存對齊

上面說到,聯(lián)合體的大小,至少是最大成員變量的大小。為什么是至少呢?

我們先來看下面的栗子:

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)合體中也存在著對齊

上面的栗子中,會(huì)認(rèn)為字符數(shù)組的默認(rèn)對齊數(shù)為1,而short的默認(rèn)對其數(shù)位2,但是成員變量的大小會(huì)根據(jù)數(shù)組的大小來計(jì)算,而不是根據(jù)數(shù)組的元素類型。假如你是元素個(gè)數(shù)為6的字符數(shù)組,那么大小就是6,元素個(gè)數(shù)為5的字符數(shù)組,大小就是5,而int、short等數(shù)據(jù)類型就按照默認(rèn)的大小來計(jì)算。

首先需要聯(lián)合體的大小至少是最大成員變量的大小。

然后要求大小應(yīng)該為各個(gè)成員變量中,最大對齊數(shù)的倍數(shù),如果不是倍數(shù),那么對齊到整數(shù)倍處。

這就能說明,為什么上面的代碼把字符數(shù)組的大小改為5個(gè)元素的時(shí)候,聯(lián)合體的大小仍然為6.

結(jié)語

今天的分享到這里就結(jié)束啦!

由于本人能力有限,難免會(huì)有出錯(cuò)的地方,還希望各位能夠指出!

希望各位能給我點(diǎn)個(gè)贊、點(diǎn)個(gè)收藏哦~

謝謝支持!

在這里插入圖片描述

到此這篇關(guān)于C語言關(guān)于自定義數(shù)據(jù)類型之枚舉和聯(lián)合體詳解的文章就介紹到這了,更多相關(guān)C語言 自定義數(shù)據(jù)類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • C++中的繼承問題(繼承基本概念、菱形虛擬繼承的對象模型)

    C++中的繼承問題(繼承基本概念、菱形虛擬繼承的對象模型)

    這篇文章主要介紹了C++中的繼承問題(繼承基本概念、菱形虛擬繼承的對象模型),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 一文讓你徹底明白C++中的const

    一文讓你徹底明白C++中的const

    這篇文章主要給大家介紹了關(guān)于C++中const的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C++深淺拷貝和寫時(shí)拷貝圖文詳解

    C++深淺拷貝和寫時(shí)拷貝圖文詳解

    這篇文章主要給大家介紹了關(guān)于C++深淺拷貝和寫時(shí)拷貝的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C++文件讀和寫的使用

    C++文件讀和寫的使用

    本文主要介紹了C++文件讀和寫的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C/C++中棧(stack)&堆(heap)詳解及其作用介紹

    C/C++中棧(stack)&堆(heap)詳解及其作用介紹

    這篇文章主要介紹了C/C++中棧(stack)&堆(heap)詳解及其作用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C語言中sizeof 和 strlen的區(qū)別

    C語言中sizeof 和 strlen的區(qū)別

    sizeof?和?strlen?是兩個(gè)常用于 C/C++ 語言中的函數(shù)或操作符,本文主要介紹了C語言中sizeof 和 strlen的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • C 語言基礎(chǔ)教程(我的C之旅開始了)[九]

    C 語言基礎(chǔ)教程(我的C之旅開始了)[九]

    C 語言基礎(chǔ)教程(我的C之旅開始了)[九]...
    2007-02-02
  • C++實(shí)現(xiàn)顯示MP3文件信息的方法

    C++實(shí)現(xiàn)顯示MP3文件信息的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)顯示MP3文件信息的方法,可實(shí)現(xiàn)顯示如作者、專輯等(libZPlay)信息的功能,需要的朋友可以參考下
    2015-06-06
  • c++ bitset詳解

    c++ bitset詳解

    這篇文章主要介紹了C++ bitset用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • 最新評論

    阳新县| 临沧市| 郁南县| 石台县| 务川| 馆陶县| 富锦市| 阳西县| 正宁县| 剑阁县| 延川县| 保定市| 离岛区| 武安市| 丽江市| 青河县| 沿河| 合作市| 宣恩县| 林口县| 天峻县| 安国市| 桐梓县| 南澳县| 浮山县| 晋宁县| 扶沟县| 原平市| 黑水县| 舞钢市| 彰化县| 墨竹工卡县| 昌乐县| 花莲市| 博兴县| 镇坪县| 德清县| 洪雅县| 于田县| 江城| 乌拉特前旗|