激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務(wù)器之家 - 編程語言 - C/C++ - C語言關(guān)于自定義數(shù)據(jù)類型之枚舉和聯(lián)合體詳解

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

2022-02-28 14:59Ersansui C/C++

枚舉顧名思義就是把所有的可能性列舉出來,像一個星期分為七天我們就可以使用枚舉,聯(lián)合體是由關(guān)鍵字union和標簽定義的,和枚舉是一樣的定義方式,不一樣的是,一個聯(lián)合體只有一塊內(nèi)存空間,什么意思呢,就相當(dāng)于只開辟最

前言

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

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

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

枚舉

什么是枚舉?

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

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

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

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

枚舉類型的定義

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

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

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

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

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

例如如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
enum Day//星期
{
    Mon,
    Tues,
    Wed,
    Thur,
    Fri,
    Sat,
    Sun
};
 
 
 
enum Sex//性別
{
    MALE,
    FEMALE,
    SECRET
};
 
 
enum Color//顏色
{
    RED,
    GREEN,
    BLUE
};

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

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

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

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

其實是需要的。

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

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

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

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

枚舉類型的使用

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
enum Color//顏色
{
    RED,
    GREEN,
    BLUE
};
 
 
//使用方法和其他類型一直,就像int a;一樣
enum Color clr;
 
//使用枚舉值來給枚舉類型賦值
clr = RED;
 
//注意,一般我們給枚舉賦值的時候,都用枚舉值,而不用其他的值,否則就沒有什么意義了

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

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

此外,還有其他的方法:

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

?
1
2
3
4
5
6
enum Color//顏色
{
    RED,
    GREEN,
    BLUE
}clr1,clr2;//在最后這里,我們定義了兩個枚舉變量

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

?
1
2
3
4
5
6
enum
{
    RED,
    GREEN,
    BLUE
}clr1,clr2;//這里定義了兩個枚舉變量

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef enum Color//顏色
{
    RED,
    GREEN,
    BLUE
}cr;//注意,這里的cr是新的枚舉類型名字,不是定義的枚舉變量
 
 
 
//還可以匿名重命名
 
typedef enum
{
    RED,
    GREEN,
    BLUE
}cr;

枚舉中需要注意的點

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

聯(lián)合體

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

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

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

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

栗子如下:

?
1
2
3
4
5
union Un
{
    char c;
    int i;
};

聯(lián)合體的特點

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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;
}

運行上面的代碼,我們會發(fā)現(xiàn)三個地址都相同

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

成員變量i是第一個成員,該地址和聯(lián)合體的地址相同我們可以理解,c作為第二個成員變量,其地址也是和第一個成員變量的地址相同,那么這就說明,它們確實使用的是同一塊空間

聯(lián)合體的使用

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

先創(chuàng)建模板,在定義變量

?
1
2
3
4
5
6
union Un
{
    int i;
    char c;
};
union Un un;

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

?
1
2
3
4
5
union Un
{
    int i;
    char c;
}un;//此處的un是一個聯(lián)合體變量

匿名定義聯(lián)合體變量

?
1
2
3
4
5
union
{
    int i;
    char c;
}un;//此處的un是一個聯(lián)合體變量

同樣的,由于聯(lián)合體類型名的省略,我們只可以這樣來定義變量,后面就再也不能使用該模板來定義變量了

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

?
1
2
3
4
5
6
7
8
9
10
11
12
typedef union Un
{
    int i;
    char c;
}un;
 
 
typedef union
{
    int i;
    char c;
}un;

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

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

我們先來看下面的栗子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
union Un
{
    char arr[6];
    short s;
};
 
union Un u;
 
int main() {
 
    // 下面輸出的結(jié)果是一樣的嗎?
    printf("%u", sizeof(union Un));
 
    return 0;
}

上面的代碼輸出的結(jié)果為6

如果我們把字符數(shù)組的大小改成5,會發(fā)現(xiàn)大小還是6

這是因為,聯(lián)合體中也存在著對齊

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

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

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

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

結(jié)語

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

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

希望各位能給我點個贊、點個收藏哦~

謝謝支持!

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

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

原文鏈接:https://blog.csdn.net/weixin_61021362/article/details/120961494

延伸 · 閱讀

精彩推薦
  • C/C++C語言實現(xiàn)電腦關(guān)機程序

    C語言實現(xiàn)電腦關(guān)機程序

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)電腦關(guān)機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C/C++經(jīng)典實例之模擬計算器示例代碼

    C/C++經(jīng)典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關(guān)于C/C++經(jīng)典實例之模擬計算器的相關(guān)資料,文中通過示...

    jia150610152021-06-07
  • C/C++c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    這篇文章主要介紹了c++ 單線程實現(xiàn)同時監(jiān)聽多個端口的方法,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++學(xué)習(xí)C++編程的必備軟件

    學(xué)習(xí)C++編程的必備軟件

    本文給大家分享的是作者在學(xué)習(xí)使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    strcpy 和strcnpy函數(shù)是字符串復(fù)制函數(shù)。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數(shù)使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內(nèi)存中的數(shù)據(jù)都是暫時的,當(dāng)程序結(jié)束時,它們都將丟失,為了永久性的保存大量的數(shù)據(jù),C語言提供了對文件的操作,這篇文章主要給大家介紹了關(guān)于C語言中文件...

    針眼_6702022-01-24
  • C/C++深入理解goto語句的替代實現(xiàn)方式分析

    深入理解goto語句的替代實現(xiàn)方式分析

    本篇文章是對goto語句的替代實現(xiàn)方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網(wǎng)7342020-12-03
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下...

    青山的青6062022-01-04
1106
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 久久天堂 | 在线观看91精品 | 午夜视频久久 | 香蕉视频99 | 欧美成人自拍 | 亚洲国产精品一区二区三区 | 亚洲国产网站 | 91中文字幕在线观看 | 亚洲字幕av| 免费色片 | 久久精品视频日本 | www.99av| 久久男人视频 | 日韩美香港a一级毛片免费 久久精品视频1 | 男女羞羞视频在线免费观看 | 九草在线视频 | 国产毛片在线看 | 久久久久久久一区 | 国产一级免费片 | 午夜影院a| 亚洲无毛av | 欧美一区2区三区4区公司二百 | 91系列在线观看 | 看免费毛片 | 国产福利视频在线观看 | 欧美高清一级片 | 久久精品一区视频 | 欧美久久久一区二区三区 | 香蕉久久久久 | 91福利社在线 | 久久久国产精品电影 | 欧美毛片| 369看片你懂的小视频在线观看 | 天堂精品在线 | 成人午夜一区二区 | 亚洲精品午夜在线 | 国产女同疯狂激烈互摸 | 中文字幕精品在线播放 | 精品午夜久久 | 男女羞羞在线观看 | 精品久久久久久成人av |