【C語言回顧】聯合和枚舉

  • 前言
  • 1. 聯合體
    • 1.1 聯合體的聲明
    • 1.2 聯合體的特點
    • 1.3 聯合體的使用
  • 2. 枚舉
    • 2.1 枚舉的聲明
    • 2.2 枚舉的特點
    • 2.3 枚舉的使用
  • 結語

在這里插入圖片描述
在這里插入圖片描述

#include<GUIQU.h>
int main
{
上期回顧: 【C語言回顧】結構體
個人主頁:C_GUIQU
專欄:【C語言學習】
return 一鍵三連;
}

在這里插入圖片描述

前言

各位小伙伴大家好!上期小編給大家講解了C語言中的結構體,接下來我們講解一下聯合和枚舉!

1. 聯合體

1.1 聯合體的聲明

在C語言中,聯合體(Union)是一種特殊的數據類型,它允許在相同的內存位置存儲不同類型的數據。聯合體中的每個成員都有自己的類型和大小,但是聯合體的內存大小等于其最大成員的大小。

聯合體的聲明通常包括以下幾個部分:

  1. 關鍵字 union:表示聲明的是一個聯合體。
  2. 聯合體名:一個合法的標識符,用于命名這個聯合體。
  3. 成員列表:由多個成員組成,每個成員都有自己的類型和名稱。
    聯合體的聲明示例如下:
union Data {int intValue;  // 整型成員float floatValue;  // 浮點型成員char stringValue[20];  // 字符數組成員
};

在這個例子中,我們聲明了一個名為 Data 的聯合體,它包含三個成員:一個整型成員 intValue、一個浮點型成員 floatValue 和一個字符數組成員 stringValue。聯合體的內存大小至少與 stringValue 成員的大小相同,因為 stringValue 是最大的成員。
聯合體的使用方式通常是這樣的:

union Data data;
data.intValue = 10; // 設置整型成員的值
printf("整型成員的值:%d\n", data.intValue);
data.floatValue = 3.14; // 設置浮點型成員的值
printf("浮點型成員的值:%f\n", data.floatValue);
data.stringValue[0] = 'A'; // 設置字符數組成員的值
printf("字符數組成員的值:%c\n", data.stringValue[0]);

請注意,當訪問聯合體中的不同成員時,需要使用不同的訪問方法,因為每個成員在內存中的位置是不同的。此外,由于聯合體的內存大小是最大的成員的大小,所以在使用聯合體時需要注意內存的有效管理。

1.2 聯合體的特點

  1. 內存共享:聯合體的所有成員共享同一塊內存空間,這意味著同一時間只能存儲一個成員的數據。當一個成員被修改時,其他成員的數據也會被修改。
  2. 最小大小:聯合體的內存大小等于其所有成員中最大成員的大小。這意味著即使聯合體中只有一個小成員,整個聯合體的大小也會是該成員的大小。
  3. 成員訪問:聯合體中的成員可以通過點操作符(.)來訪問。例如,如果聯合體名為 unionType,成員名為 memberName,則可以通過 unionType.memberName 來訪問該成員。
  4. 類型限制:每個成員必須有相同的訪問權限(public或private),因為它們共享同一塊內存空間。
  5. 類型轉換:由于聯合體的成員類型可以不同,因此在訪問聯合體成員時,需要進行類型轉換。例如,如果一個聯合體包含一個整型和一個浮點型成員,當訪問浮點型成員時,需要將整型成員轉換為浮點型。
  6. 編譯器處理:編譯器會為聯合體的每個成員分配內存,并且當成員被訪問時,編譯器會自動處理內存的讀取和寫入操作。
  7. 限制使用:由于聯合體的特殊性質,它并不適合所有的數據存儲需求。在某些情況下,使用結構體(Structure)可能更加合適,因為結構體允許同時存儲不同類型的數據,并且每個成員都有獨立的內存空間。

1.3 聯合體的使用

聯合體(Union)在C語言中用于在同一內存位置存儲不同類型的數據。它特別適用于需要靈活地使用不同數據類型的場合,或者當內存空間非常寶貴時。以下是聯合體的幾種典型使用場景:

  1. 數據交換:當兩個不同的程序或模塊需要交換數據,而數據類型又不完全匹配時,可以使用聯合體來存儲一個混合的數據類型,然后將這個聯合體傳遞給需要處理數據的程序或模塊。
  2. 存儲多種類型的信息:在某些情況下,需要同時存儲多種類型的信息,例如,一個結構體可能包含一個整數和一個浮點數,但是有時只需要存儲整數,有時只需要存儲浮點數。這時可以使用聯合體來節省內存。
  3. 動態類型:在某些編程模型中,可能需要根據運行時的條件來決定存儲什么類型的數據。聯合體可以提供這樣的靈活性,因為它的成員類型可以不同。
  4. 網絡通信:在網絡編程中,經常需要處理不同類型的數據,如整數、字符串、浮點數等。使用聯合體可以方便地打包和解析這些數據。
  5. 游戲開發:在游戲開發中,可能會遇到需要存儲多種狀態的情況,如玩家的位置、速度、狀態等。使用聯合體可以更有效地管理這些狀態信息。

在使用聯合體時,需要注意以下幾點:

  • 訪問成員時要小心,因為一旦一個成員被訪問,其他成員的數據可能會被破壞。
  • 不要在聯合體中存儲非常大或非常小的數據類型,因為這可能會導致內存碎片化。
  • 確保聯合體的成員類型兼容,以便在訪問成員時不需要進行復雜的類型轉換。

下面是一個簡單的例子,展示了如何在C語言中使用聯合體:

#include <stdio.h>
union Data {int intValue;float floatValue;
};
int main() 
{union Data data;data.intValue = 10;printf("整型值:%d\n", data.intValue);data.floatValue = 3.14;printf("浮點型值:%f\n", data.floatValue);return 0;
}

在這個例子中,我們定義了一個名為 Data 的聯合體,它包含一個整型成員 intValue 和一個浮點型成員 floatValue。在 main 函數中,我們創建了一個 Data 類型的變量 data,并分別設置它的整型和浮點型成員的值。

2. 枚舉

2.1 枚舉的聲明

在C語言中,枚舉(Enum)是一種特殊的數據類型,用于定義一組命名的常量。枚舉類型可以用于定義一組相關的常量,這些常量通常用于表示不同的狀態、選項或枚舉值。枚舉聲明通常包括以下幾個部分:

  1. 關鍵字 enum:表示聲明的是一個枚舉類型。
  2. 枚舉名:一個合法的標識符,用于命名這個枚舉類型。
  3. 枚舉值列表:由多個枚舉值組成,每個枚舉值后面可以跟隨一個數字(可選),表示該枚舉值在枚舉中的值。

枚舉的聲明示例如下:

enum Day {SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY
};

在這個例子中,我們聲明了一個名為 Day 的枚舉類型,它包含了一周中的七天。每個枚舉值后面都沒有跟隨數字,因此它們的值會從0開始自動遞增。第一個枚舉值 SUNDAY 的值為0,第二個枚舉值 MONDAY 的值為1,依此類推。

枚舉的使用方式通常是這樣的:

enum Day today;
today = FRIDAY;
printf("今天是:%d(%s)\n", today, enum_Day_string(today));

在這個例子中,我們聲明了一個名為 today 的枚舉變量,并將其賦值為 FRIDAY。然后,我們使用一個自定義的函數 enum_Day_string 來將枚舉值轉換為對應的枚舉名稱。

請注意,枚舉值默認從0開始,如果需要從其他值開始,可以在枚舉值后面添加一個數字。例如:

enum Day {SUNDAY = 7,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY
};

在這個例子中,SUNDAY 的值被顯式設置為7,而其他枚舉值的值會從8開始遞增。

2.2 枚舉的特點

  1. 命名的常量:枚舉提供了一種方便的方式來定義一組相關的常量,這些常量可以被賦予有意義的名稱,使得代碼更加可讀和易于維護。
  2. 值的范圍:枚舉值通常是整數,并且它們可以具有預定義的范圍。枚舉值可以是從0開始的整數,也可以從某個特定的值開始。
  3. 類型安全:枚舉值在編譯時被確定,因此在運行時不會出現類型不匹配的問題。這有助于提高代碼的健壯性。
  4. 數據類型:枚舉類型在編譯時會被轉換為整數類型。默認情況下,枚舉值會從0開始遞增,但也可以從其他值開始。
  5. 默認值:如果枚舉值沒有顯式指定初始值,編譯器會自動為每個枚舉值分配一個從0開始的整數值。
  6. 枚舉的枚舉:雖然這不是枚舉的主要用途,但是可以定義一個枚舉來表示另一個枚舉的值,這被稱為枚舉的枚舉。
  7. 枚舉的比較:枚舉值可以進行比較操作,因為它們都是整數。這使得枚舉可以用于表示狀態或選項,并且可以方便地進行邏輯判斷。
  8. 枚舉的數組:枚舉值可以作為數組的索引,因為它們都是整數。這使得枚舉可以用于表示選項集合,并且可以方便地進行循環遍歷。
  9. 枚舉的指針:雖然不常見,但枚舉值可以作為指針,指向一個包含枚舉值的數組。
  10. 枚舉的函數參數:枚舉值可以作為函數的參數,這使得枚舉可以用于表示狀態或選項,并且可以方便地進行狀態切換。

2.3 枚舉的使用

在C語言中,枚舉(Enum)主要用于定義一組相關的常量,這些常量通常用于表示不同的狀態、選項或枚舉值。枚舉的使用方式如下:

  1. 聲明枚舉:首先,使用 enum 關鍵字聲明一個枚舉類型,后面跟著枚舉名和枚舉值列表。
enum Day {SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY
};
  1. 定義枚舉變量:使用枚舉類型聲明一個變量,并可以為該變量賦值。
enum Day today;
today = FRIDAY;
  1. 枚舉值的訪問:通過點操作符(.)訪問枚舉變量的值。
printf("今天是:%d(%s)\n", today, enum_Day_string(today));
  1. 枚舉值的比較:枚舉值可以進行比較操作,因為它們都是整數。
if (today == FRIDAY) {printf("今天是星期五\n");
}
  1. 枚舉值的數組:枚舉值可以作為數組的索引,因為它們都是整數。
enum Day days[] = {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
for (int i = 0; i < 7; i++) {printf("星期%d是%s\n", i + 1, enum_Day_string(days[i]));
}
  1. 枚舉值的指針:雖然不常見,但枚舉值可以作為指針,指向一個包含枚舉值的數組。
enum Day *days_ptr = days;
for (int i = 0; i < 7; i++) {printf("星期%d是%s\n", i + 1, enum_Day_string(*(days_ptr + i)));
}
  1. 枚舉值的函數參數:枚舉值可以作為函數的參數,這使得枚舉可以用于表示狀態或選項,并且可以方便地進行狀態切換。
void printDay(enum Day day) {switch (day) {case SUNDAY:printf("今天是星期日\n");break;case MONDAY:printf("今天是星期一\n");break;// 其他星期...default:printf("輸入的星期值無效\n");break;}
}
printDay(SUNDAY); // 調用函數,打印今天是星期日

請注意,枚舉值在編譯時會被轉換為整數類型,因此在訪問枚舉值時需要進行適當的轉換。此外,枚舉值默認從0開始,如果需要從其他值開始,可以在枚舉值后面添加一個數字。

結語

以上就是小編對聯合和枚舉的詳細講解。
如果覺得小編講的還可以,還請一鍵三連。互三必回!
持續更新中~!

在這里插入圖片描述

在這里插入圖片描述

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

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

相關文章

解決法律條文的錄入前判斷發條沖突的需求;怎么選擇NLPModel?怎么使用模型?

要在NLPModel類中實現法律條文的沖突檢測功能&#xff0c;可以使用BERT模型來計算句子相似度。以下是詳細的步驟&#xff0c;包括如何選擇模型、訓練模型以及使用模型。 選擇NLP模型 根據你的需求&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Tra…

Linux多線程系列三: 生產者消費者模型,信號量使用,基于阻塞隊列和環形隊列的這兩種生產者消費者代碼的實現

Linux多線程系列三: 生產者消費者模型,信號量,基于阻塞隊列和環形隊列的這兩種生產者消費者代碼的實現 一.生產者消費者模型的理論1.現實生活中的生產者消費者模型2.多線程當中的生產者消費者模型3.理論 二.基于阻塞隊列的生產者消費者模型的基礎代碼1.阻塞隊列的介紹2.大致框架…

別說廢話!說話說到點上,項目高效溝通的底層邏輯揭秘

假設你下周要在領導和同事面前匯報項目進度&#xff0c;你會怎么做&#xff1f;很多人可能會去網上搜一個項目介紹模板&#xff0c;然后按照模板來填充內容。最后&#xff0c;匯報幻燈片做了 80 頁&#xff0c;自己覺得非常充實&#xff0c;但是卻被領導痛批了一頓。 這樣的境…

樹的非遞歸遍歷(層序)

層序是采用隊列的方式來遍歷的 就比如說上面這顆樹 他層序的就是&#xff1a;1 24 356 void LevelOrder(BTNode* root) {Que q;QueueInit(&q);if (root){QueuePush(&q, root);}while (!QueueEmpty(&q)){BTNode* front QueueFront(&q);QueuePop(&q);print…

簡析網絡風險量化的價值與應用實踐,如何構建網絡風險預防架構

網絡風險量化能夠讓公司董事會和高管層看清當前的網絡安全風險格局&#xff1b;它還將使安全團隊能夠在業務需求的背景下做出網絡安全決策&#xff0c;幫助組織確定哪些風險對業務構成最大的威脅&#xff0c;以及預期的經濟損失將是什么。 隨著網絡攻擊手段的日益多樣化和復雜…

多模態大模型新進展——GPT-4o、Project Astra關鍵技術丨青源Workshop第27期

青源Workshop丨No.27 多模態大模型新進展—GPT-4o、Project Astra關鍵技術主題閉門研討會 剛剛過去的兩天&#xff0c;OpenAI、Google紛紛發布了多模態大模型的最新成果&#xff0c;GPT-4o、Project Astra先后亮相。 本周五&#xff08;北京時間5月17日&#xff09;18點&#x…

O2OA(翱途)開發平臺數據統計如何配置?

O2OA提供的數據管理中心&#xff0c;可以讓用戶通過配置的形式完成對數據的匯總&#xff0c;統計和數據分組展現&#xff0c;查詢和搜索數據形成列表數據展現。也支持用戶配置獨立的數據表來適應特殊的業務的數據存儲需求。本文主要介紹如何在O2OA中開發和配置統計。 一、先決…

eNSP學習——OSPF多區域配置

目錄 主要命令 前期準備 實驗內容 分析 實驗目的 實驗步驟 實驗拓撲 實驗編址 實驗步驟 1、基本配置 配置與測試結果(部分) 2、配置骨干區域路由器 配置與測試結果(示例) 3、配置非骨干區域路由器 查看OSPF鄰居狀態 查看路由表中的OSPF路由條目 查看OSPF鏈…

【30天精通Prometheus:一站式監控實戰指南】第6天:mysqld_exporter從入門到實戰:安裝、配置詳解與生產環境搭建指南,超詳細

親愛的讀者們&#x1f44b; ??歡迎加入【30天精通Prometheus】專欄&#xff01;&#x1f4da; 在這里&#xff0c;我們將探索Prometheus的強大功能&#xff0c;并將其應用于實際監控中。這個專欄都將為你提供寶貴的實戰經驗。&#x1f680; ??Prometheus是云原生和DevOps的…

python設計模式--觀察者模式

觀察者模式是一種行為設計模式&#xff0c;它定義了一種一對多的依賴關系&#xff0c;讓多個觀察者對象同時監聽某一個主題對象&#xff0c;當主題對象狀態發生變化時&#xff0c;會通知所有觀察者對象&#xff0c;使它們能夠自動更新。 在 Python 中&#xff0c;觀察者模式通…

PersonalLLM——探索LLM是否能根據五大人格特質重新塑造一個新的角色?

1.概述 近年來&#xff0c;大型語言模型&#xff08;LLMs&#xff09;&#xff0c;例如ChatGPT&#xff0c;致力于構建能夠輔助人類的個性化人工智能代理&#xff0c;這些代理以進行類似人類的對話為重點。在學術領域&#xff0c;尤其是社會科學中&#xff0c;一些研究報告已經…

正心歸一、綻放真我 好普集團正一生命文化藝術大賽(中老年賽區)正式啟動

為進一步弘揚社會主義核心價值觀&#xff0c;弘揚生命文化&#xff0c;提升公眾對生命價值的認識與尊重&#xff0c;同時展現中老年藝術家的創作才華&#xff0c;激發廣大中老年朋友的藝術熱情和創造力。好普集團主辦&#xff0c;幸福金齡會與正一生命科學研究&#xff08;廣州…

adb獲取點擊坐標并模擬點擊事件(模擬滑動)

屏幕分辨率&#xff1a; $ adb shell wm size Physical size: 1080x2340 獲取設備的最大X和Y&#xff1a; 為8639 18719 $ adb shell getevent -p | grep -e "0035" -e "0036" 0035 : value 0, min 0, max 8639, fuzz 0, flat 0, resolution 0 0036 : v…

AWS安全性身份和合規性之Artifact

AWS Artifact是對您很重要的與合規性相關的信息的首選中央資源。AWS Artifact是一項服務&#xff0c;提供了一系列用于安全合規的文檔、報告和資源&#xff0c;以幫助用戶滿足其合規性和監管要求。它允許按需訪問來自AWS和在AWS Marketplace上銷售產品的ISV的安全性和合規性報告…

網絡模型-VLAN聚合

VLAN聚合 VLAN聚合(VLAN Aggregation,也稱SuperVLAN)指在一個物理網絡內&#xff0c;用多個VLAN(稱為Sub-VLAN)隔離廣播域并將這些Sub-VLAN聚合成一個邏輯的VLAN(稱為SuperVLAN)&#xff0c;這些Sub-VLAN使用同一個IP子網和缺省網關&#xff0c;&#xff0c;進而達到節約IP地址…

BOM..

區別&#xff1a;

基于BERT的醫學影像報告語料庫構建

大模型時代&#xff0c;任何行業&#xff0c;任何企業的數據治理未來將會以“語料庫”的自動化構建為基石。因此這一系列精選的論文還是圍繞在語料庫的建設以及自動化的構建。 通讀該系列的文章&#xff0c;猶如八仙過海&#xff0c;百花齊放。非結構的提取無外乎關注于非結構…

excel轉pdf并且加水印,利用ByteArrayOutputStream內存流不產生中間文件

首先先引入包&#xff1a;加水印和excel轉PDF的 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.12</version></dependency><dependency><groupId>org.apache.poi&l…

2024全新爆款好物推薦,618必買數碼好物清單吐血整理!

?距離618購物狂歡節越來越近了&#xff0c;有很多日常價格不菲的產品在這次活動期間都會進行促銷活動&#xff0c;尤其是數碼類產品&#xff0c;加上618的優惠活動更有吸引力了。不過面對大促的熱潮我們消費者在選購商品的同時還是要擦亮眼睛&#xff0c;避免買到質量不好的商…

SSE 與 SASE哪個云原生安全框架更加適合

近年來&#xff0c;隨著云計算和網絡技術的不斷發展&#xff0c;出現了一種新的網絡安全解決方案——SASE&#xff08;安全訪問服務邊緣&#xff09;。SASE是一種將網絡和安全功能融合到單個基于云的服務中的框架&#xff0c;旨在提供更加安全、高效和便捷的網絡訪問體驗。SASE…