枚舉(enum)+聯合體(union)

枚舉+聯合

  • 一.枚舉類型
    • 1.枚舉類型的聲明
    • 2.枚舉類型的優點
    • 3.枚舉類型的使用
  • 二.聯合體
    • 1.聯合體類型的聲明
    • 2.聯合體的特點
    • 3.相同成員的結構體和聯合體對比
    • 4.聯合體大小的計算
    • 5.聯合體的練習(判斷大小端)
    • 6.聯合體節省空間例題

一.枚舉類型

1.枚舉類型的聲明

  • 枚舉顧名思義就是一一列舉,把可能的取值一一列舉。

比如我們現實生活中:

  1. 一周的星期?到星期日是有限的7天,可以一一列舉。
  2. 性別有:男、女、保密,也可以一一列舉。
  3. 月份有12個月,也可以一一列舉。
  4. 三原色,也是可以一一列舉。

這些數據的表示就可以使用枚舉了,代碼如下:

#include<stdio.h>
enum Day//星期 
{//該枚舉類型有七種可能值,它們都是常量,被稱為枚舉常量Mon,Tues,Wed,Thur=9,Fri,Sat,Sun
};
int main()
{enum Day day1 = Mon;enum Day day2 = Sun;printf("%d\n", Mon);//0printf("%d\n", Tues);//1printf("%d\n", Wed);//2printf("%d\n", Thur);//9printf("%d\n", Fri);//10printf("%d\n", Sat);//11printf("%d\n", Sun);//12return 0;
}
  1. 以上定義的 enum Day ,是枚舉類型
  2. { }中的內容是枚舉類型的可能取值,也叫枚舉常量
  3. 枚舉類型的值通常是整數常量
  4. 這些可能取值都是有值的,默認從0開始,依次遞增1,當然在聲明枚舉類型的時候也可以賦初值,后面的值也是依次遞增1。

2.枚舉類型的優點

  • 我們可以使用 #define 定義常量,為什么非要使用枚舉?

枚舉的優點:

  1. 增加代碼的可讀性和可維護性。

  2. 和 #define 定義的標識符比較枚舉有類型檢查,更加嚴謹。

  3. 便于調試,預處理階段會刪除 #define 定義的符號。

  4. 使用方便,一次可以定義多個常量。

  5. 枚舉常量是遵循作用域規則的,枚舉聲明在函數內,只能在函數內使用。

3.枚舉類型的使用

  • 枚舉舉例:寫一個計算器完成整數的加法,減法,乘法,除法
#include<stdio.h>
enum Option
{EXIT,//0ADD,//1SUB,//2MUL,//3DIV//4
};
void menu()
{printf("*************************\n");printf("**1:add           2:sub**\n");printf("**3:mul           4:div**\n");printf("**0:exit                 \n");printf("*************************\n");
}
int Add(int x, int y)
{return x + y;
}
int Sub(int x, int y)
{return x - y;
}
int Mul(int x, int y)
{return x * y;
}
int Div(int x, int y)
{return x / y;
}
int Cal(int(*pf)(int, int))
{int ret = 0;int x = 0;int y = 0;printf("請輸入兩個數:>");scanf("%d %d", &x, &y);ret = pf(x, y);printf("%d\n", ret);
}
int main()
{int input = 0;do{menu();printf("請選擇:>");scanf("%d", &input);switch (input){case ADD:Cal(Add);break;case SUB:Cal(Sub);break;case MUL:Cal(Mul);break;case DIV:Cal(Div);break;case EXIT:printf("退出\n");break;default:printf("選擇錯誤,請重新選擇\n");break;}} while (input);return 0;
}

二.聯合體

1.聯合體類型的聲明

  1. 像結構體?樣,聯合體也是由?個或者多個成員構成,這些成員可以不同的類型,但是編譯器只為最大的成員分配足夠的內存空間。
  2. 聯合體的特點是所有成員共?同?塊內存空間。所以聯合體也叫:共用體
#include<stdio.h>
union Un//聯合體
{char c;int i;
};
int main()
{printf("%zd\n", sizeof(union Un));//4個字節return 0;
}
  • 運行可知聯合體union Un只占用4個字節,這是為什么呢?

2.聯合體的特點

  1. 聯合的成員是共用同一塊內存空間的,這樣一個聯合變量的大小至少是最大成員的大小(因為聯合至少得有能力保存最大的那個成員)。
  2. 修改聯合體其中?個成員,其他成員的值也跟著變化。
#include<stdio.h>
union Un
{char c;int i;
};
int main()
{union Un un = { 0 };printf("& un   =%p\n", &un);printf("&(un.c)=%p\n", &(un.c));printf("&(un.i)=%p\n", &(un.i));return 0;
}

在這里插入圖片描述

#include <stdio.h>
//聯合類型的聲明 
union Un
{char c;int i;
};
int main()
{//聯合變量的定義 union Un un = { 0 };un.i = 0x11223344;un.c = 0x55;printf("%x\n", un.i);//11223355return 0;
}

在這里插入圖片描述

3.相同成員的結構體和聯合體對比

#include<stdio.h>
struct S//結構體
{char c;int i;
};
union Un//聯合體
{char c;int i;
};
int main()
{printf("%zd\n", sizeof(struct S));//8個字節printf("%zd\n", sizeof(union Un));//4個字節return 0;
}
  • 對比一下相同成員的結構體和聯合體的內存布局情況。

在這里插入圖片描述

4.聯合體大小的計算

  1. 聯合的大小至少是最大成員的大小。
  2. 當最大成員大小不是最大對齊數的整數倍的時候,聯合的大小就是最大對齊數的整數倍。
#include<stdio.h>
union Un
{char arr[5];//相當于五個char變量,char c1;char c2;char c3;char c4;char c5;//自身大小:1,默認對齊數:8,對齊數:1int i;//自身大小:4,默認對齊數:8,對齊數:4//二者的最大對齊數是4,聯合體的總大小是4的倍數,//而5不是4的倍數,所以聯合體的大小是8
};
union Un2
{short c[7];//14  2 8 2int i;//         4 8 4
};
int main()
{printf("%zd\n", sizeof(union Un));//8printf("%d\n", sizeof(union Un2));//16return 0;
}

在這里插入圖片描述

5.聯合體的練習(判斷大小端)

#include<stdio.h>
int check_sys()
{union{int i;char c;}un;un.i = 1;return un.c;//返回1是小端,返回0是大端 
}
int main()
{if (check_sys() == 1)printf("小端\n");elseprintf("大端\n");return 0;
}

在這里插入圖片描述

6.聯合體節省空間例題

  • 比如,我們要搞一個活動,要上線一個禮品兌換單,禮品兌換單中有三種商品:圖書、杯子、襯衫。每?種商品都有:庫存量、價格、商品類型和商品類型相關的其他信息。
  1. 圖書:書名、作者、頁數。
  2. 杯子:設計。
  3. 襯衫:設計、可選顏色、可選尺寸。

那我們不耐心思考,直接寫出以下結構:

#include<stdio.h>
struct gift_list
{//公共屬性 int stock_number;//庫存量 double price; //定價 int item_type;//商品類型 //特殊屬性 char title[20];//書名 char author[20];//作者 int num_pages;//頁數 char design[30];//設計 int colors;//顏色int sizes;//尺寸
};
  • 上述的結構其實設計的很簡單,用起來也方便,但是結構的設計中包含了所有禮品的各種屬性,這樣使得結構體的大小就會偏大,比較浪費內存。因為對于禮品兌換單中的商品來說,只有部分屬性信息是常用的。

比如:

  • 商品是圖書,就不需要design、colors、sizes。所以我們就可以把公共屬性單獨寫出來,剩余屬于各種商品本身的屬性使用聯合體起來,這樣就可以介紹所需的內存空間,一定程度上節省了內存,代碼如下:
struct gift_list
{int stock_number;//庫存量double price; //定價int item_type;//商品類型//匿名聯合體:只用一次union{struct//匿名結構體:只用一次{char title[20];//書面char author[20];//作者int num_pages;//頁數}book;struct//匿名結構體:只用一次{char design[30];//設計}mug;struct//匿名結構體:只用一次{char design[30];//設計int colors;//顏色int sizes;//尺寸}shirt;}item;//g.item.book.num_pages=20;
}g;

創作不易,如果能幫到你的話能賞個三連嗎?感謝啦!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23082.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23082.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23082.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Sentinel1.8.6更改配置同步到nacos(項目是Gateway)

本次修改的源碼在&#xff1a;https://gitee.com/stonic-open-source/sentinel-parent 一 下載源碼 地址&#xff1a;https://github.com/alibaba/Sentinel/releases/tag/1.8.6 二 導入idea&#xff0c;等待maven下載好各種依賴 三 打開sentile-dashboard這個模塊&#xf…

介紹下CIDR(Classless Inter-Domain Routing)無類別域間路由

最近在搞DELL EMC XtremIO的重新初始化&#xff0c;在Stortage controller和XMS的xinstall配置的時候&#xff0c;需要配置用到CIDR&#xff0c;就是classless inter-domian routing&#xff0c;總結了一下&#xff0c;其實很多對網絡設備的地方都用得到&#xff0c;以前還不知…

華為手機錄屏在哪里?圖文詳解幫你找!

隨著科技的進步&#xff0c;智能手機已成為我們日常生活中不可或缺的工具。其中&#xff0c;華為手機憑借其卓越的性能和用戶體驗&#xff0c;在全球范圍內贏得了廣泛的贊譽。在眾多功能中&#xff0c;錄屏功能尤為實用&#xff0c;無論是制作教程、記錄游戲精彩瞬間&#xff0…

壓敏電阻器是在規定溫度下,當電壓超過某一臨界值時電導隨電壓的升高而急速增大的一種電阻器

壓敏電阻器是在規定溫度下,當電壓超過某一臨界值時電導隨電壓的升高而急速增大的一種電阻器。壓敏電阻器的伏安特性是非線性的,因此,壓敏電阻器亦稱為非線性電阻器,非線性來自于壓敏電阻器兩端的外加電壓,其伏安特性如圖 9-1所示。從圖9-1可以看出,壓敏電阻器有對稱型和非對稱型…

網絡運維簡介

目錄 1.網絡運維的定義 2.誕生背景 3.網絡運維的重要性 4.優點 5.缺點 6.應用場景 6.1.十個應用場景 6.2.數據中心運維 7.應用實例 8.小結 1.網絡運維的定義 網絡運維&#xff08;Network Operations&#xff09;是指管理、監控和維護計算機網絡以確保其高效、安全和…

2024最新華為OD算法題目

在一個機房中,服務器的位置標識在 n*m 的整數矩陣網格中,1表示單元格上有服務器,0 表示沒有。如果兩臺服務器位于同一行或者同一列中緊鄰的位置,則認為它們之間可以組成一個局域網。請你統計機房中最大的局域網包含的服務器個數。 輸入描述 第一行輸入兩個正整數,n和m,…

Python私教張大鵬 Vue3整合AntDesignVue之文本組件

案例&#xff1a;展示標題 核心代碼&#xff1a; <a-typography><a-typography-title>Introduction</a-typography-title> </a-typography>vue3示例&#xff1a; <template><a-typography><a-typography-title>這是一個標題</…

HTTP請求過程

HTTP&#xff08;超文本傳輸協議&#xff09;請求過程是客戶端&#xff08;通常是瀏覽器&#xff09;與服務器之間通信的方式&#xff0c;用于從服務器請求資源&#xff08;如網頁、圖片、視頻等&#xff09;。以下是HTTP請求的基本步驟&#xff1a; 建立TCP連接&#xff1a; 如…

【K8s】專題四(6):Kubernetes 控制器之 Job

以下內容均來自個人筆記并重新梳理&#xff0c;如有錯誤歡迎指正&#xff01;如果對您有幫助&#xff0c;煩請點贊、關注、轉發&#xff01;歡迎掃碼關注個人公眾號&#xff01; 目錄 一、基本介紹 二、工作原理 三、相關特性 四、資源清單&#xff08;示例&#xff09; 五…

C語言經典習題20

一編寫一個函數用于計算高于平均分的人數 編寫一個函數int fun(float s[],int n)&#xff0c;用于計算高于平均分的人數&#xff0c;并作為函數值返回&#xff0c;其中數組s中存放n位學生的成績。再編寫一個主函數&#xff0c;從鍵盤輸入一批分數&#xff08;用-1來結束輸入&a…

電路分析答疑 1

三要素法求解的時候&#xff0c; 電容先求U&#xff0c;再利用求導求I 電感先求I&#xff0c;再利用求導求U 若I的頭上沒有點點&#xff0c;那就是求有效值 疊加定理&#xff0c;不要忘記 若電流值或者電壓值已經給出來了&#xff0c;那就說明這一定是直流電。 在畫畫圈的時候…

數據庫(25)——多表關系介紹

在項目開發中&#xff0c;進行數據庫表結構設計時&#xff0c;會根據業務需求及業務模塊之間的關系&#xff0c;分析并設計表結構&#xff0c;各個表之間的結構基本上分為三種&#xff1a;一對多&#xff0c;多對多&#xff0c;一對一。 一對多 例如&#xff0c;一個學校可以有…

Mac修改Mysql8.0密碼

轉載請標明出處&#xff1a;http://blog.csdn.net/donkor_/article/details/139392605 文章目錄 前言修改密碼Step1:修改my.conf文件Step2:添加配置skip-grant-tablesStep3:重啟mysql服務Step4:進入mysqlStep5:刷新權限Step6:修改密碼Step7:再次刷新權限Step8:刪除/注釋 skip-…

DNS域名

DNS域名 DNS是域名系統的簡稱 域名和ip地址之間的映射關系 互聯網中&#xff0c;ip地址是通信的唯一標識 訪問網站&#xff0c;域名&#xff0c;ip地址不好記&#xff0c;域名朗朗上口&#xff0c;好記。 域名解析的目的就是為了實現&#xff0c;訪問域名就等于訪問ip地址…

【Python】 獲取當前日期的Python代碼解析與應用

標題&#xff1a;Python中獲取當前日期的簡單指南 基本原理 在Python中&#xff0c;獲取當前日期是一個常見的需求&#xff0c;尤其是在處理日志、數據記錄和時間相關的任務時。Python提供了多種方式來獲取和處理日期和時間&#xff0c;其中最常用的模塊是datetime。datetime…

多客陪玩系統-開源陪玩系統平臺源碼-支持游戲線上陪玩家政線下預約等多場景應用支持H5+小程序+APP

多客陪玩系統-開源陪玩系統平臺源碼-支持游戲線上陪玩家政按摩線下預約等多場景應用支持H5小程序APP 軟件架構 前端&#xff1a;Uniapp-vue2.0 后端&#xff1a;Thinkphp6 前后端分離 前端支持&#xff1a; H5小程序雙端APP&#xff08;安卓蘋果&#xff09; 安裝教程 【商業…

學習VUE3——組件(一)

組件注冊 分為全局注冊和局部注冊兩種。 全局注冊&#xff1a; 在main.js或main.ts中&#xff0c;使用 Vue 應用實例的 .component() 方法&#xff0c;讓組件在當前 Vue 應用中全局可用。 import { createApp } from vue import MyComponent from ./App.vueconst app crea…

11、“十四五”大數據產業發展規劃

數據是新時代重要的生產要素, 是國家基礎性戰略資源。 大數據是數據的集合, 以容量大、 類型多、 速度快、 精度準、 價值高為主要特征, 是推動經濟轉型發展的新動力,是提升政府治理能力的新途徑, 是重塑國家競爭優勢的新機遇。 大數據產業是以數據生成、 采集、 存儲、 加…

QT C++ QTableWidget 表格合并 setSpan 簡單例子

這里說的合并指的是單元格&#xff0c;不是表頭。span的意思是跨度、寬度、范圍。 setSpan函數需要設定行、列、行跨幾格&#xff0c;列跨幾格。 //函數原型如下 void QTableView::setSpan(int row, i nt column, 、 int rowSpanCount,/*行跨過的格數*/ int columnSpanCount…

【算法無用系列】電影推薦——余弦相似度計算用戶相似度原理

【算法無用系列】通過余弦相似度計算電影、用戶相似度 話不多說&#xff0c;本文通過電影推薦系統中&#xff0c;基于余弦相似度算法計算出用戶相似和電影相似原理。希望可以幫助一些代碼不懂的同學一些思路。 記錄用戶電影評分數據 一般情況來說&#xff0c;會根據用戶的行為…