一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - C/C++ - C語言關于自定義數據類型之枚舉和聯合體詳解

C語言關于自定義數據類型之枚舉和聯合體詳解

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

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

前言

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

今天,我們一起看學習一下相關的知識吧!

C語言關于自定義數據類型之枚舉和聯合體詳解

枚舉

什么是枚舉?

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

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

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

當某些數據的值只有固定的幾種可能取值的時候,我們就可以使用枚舉類型。

枚舉類型的定義

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

枚舉類型的定義和結構體類似,先使用enum這個關鍵字,后面加上枚舉類型的名字,括號內是枚舉的值,最后別忘記分號。

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

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

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

例如如下:

?
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
};

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

枚舉類型的優點

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

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

其實是需要的。

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

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

此外,還有別的優點:

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

枚舉類型的使用

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

?
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;
 
//注意,一般我們給枚舉賦值的時候,都用枚舉值,而不用其他的值,否則就沒有什么意義了

我們一般使用結構體的時候,都像上面的栗子一樣。

先創建好枚舉的模板,燃用這個模板來創建變量。

此外,還有其他的方法:

創建模板的同時定義枚舉變量

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

省略枚舉類型名字,匿名創建枚舉變量

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

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

使用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;

枚舉中需要注意的點

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

聯合體

聯合體類型的定義

union 聯合體類型名 { 數據類型 成員名1 , 數據類型 成員名 2 , … , 數據類型 成員名n;};

聯合體也叫共用體,這個也是一種特殊的數據類型。

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

栗子如下:

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

聯合體的特點

聯合體變量的成員是使用共同的一塊空間的。

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

?
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() {
 
    // 下面輸出的結果是一樣的嗎?
    printf("%p\n", &un);
    printf("%p\n", &(un.i));
    printf("%p\n", &(un.c));
 
    return 0;
}

運行上面的代碼,我們會發現三個地址都相同

C語言關于自定義數據類型之枚舉和聯合體詳解

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

聯合體的使用

聯合體類型定義變量的方法,和結構體、枚舉類似,都有多種方法

先創建模板,在定義變量

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

創建模板的同時定義變量

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

匿名定義聯合體變量

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

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

typedef重命名聯合體類型名

?
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;

聯合體存在內存對齊

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

我們先來看下面的栗子:

?
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() {
 
    // 下面輸出的結果是一樣的嗎?
    printf("%u", sizeof(union Un));
 
    return 0;
}

上面的代碼輸出的結果為6

如果我們把字符數組的大小改成5,會發現大小還是6

這是因為,聯合體中也存在著對齊

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

首先需要聯合體的大小至少是最大成員變量的大小。

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

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

結語

今天的分享到這里就結束啦!

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

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

謝謝支持!

C語言關于自定義數據類型之枚舉和聯合體詳解

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

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

延伸 · 閱讀

精彩推薦
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

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

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

    C/C++經典實例之模擬計算器示例代碼

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

    jia150610152021-06-07
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

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

    源之緣11542021-10-27
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

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

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

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

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

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

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

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

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

    深入理解goto語句的替代實現方式分析

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

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

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

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

    青山的青6062022-01-04
主站蜘蛛池模板: 亚洲 日韩 国产 制服 在线 | 短篇最污的乱淫伦小说全集 | 双性总裁(h) | 韩国三级年轻的小婊孑 | 欧美性一区二区三区 | 免费观看无遮挡www的小视频 | 亚洲香蕉网久久综合影院3p | 情人我吃糖果小说 | 韩国禁片在线观看久 | brazzersvideo欧美最新 | 激情小视频网站 | 亚洲成人综合在线 | 成年性午夜免费视频网站不卡 | 久久婷婷五月综合色精品首页 | 国产成人无精品久久久 | 日本videossexx日本人 | h片免费网站 | 百合文高h | 精品一区二区免费视频蜜桃网 | 精品久久久久中文字幕日本 | 青草青草视频2免费观看 | 俄罗斯一级大片 | 34看网片午夜理 | 欧美黄站| 欧美一区二区三区成人看不卡 | 亚洲国产欧美日韩在线一区 | 欧美特一级 | 91精品啪在线观看国产日本 | 韩剧hd| 免费观看国产大片资源视频 | 波多野结衣中文字幕 | 32d乳白色的奶罩未删除 | 青春草在线观看视频 | 极品丝袜小说全集 | 美女裆部| 2021国产麻豆剧传媒剧情 | 国产清纯女高中生在线观看 | 国产九九 | 欧美在线视频7777kkkk | 波多野结中文字幕在线69视频 | 亚洲va天堂va国产va久久 |