C++新經典03--共用體、枚舉類型與typedef

共用體

共用體,也叫聯合,有時候需要把幾種不同類型的變量存放到同一段內存單元,例如,把一個整型變量、一個字符型變量、一個字符數組放在同一個地址開始的內存單元中。這三個變量在內存中占的字節數不同,但它們都從同一個地址開始,換句話說就是幾個變量會互相覆蓋。這種幾個變量共同占用同一段內存的存儲數據的方式,就叫共用體,這些變量也被稱為共用體成員變量(簡稱“成員”)。
看一看共用體定義的一般形式:
在這里插入圖片描述
共用體因為成員占用同一段內存,所以占用的內存大小等于占用內存最大的成員所占的內存大小,而不是每個成員所占內存大小之和。
在這里插入圖片描述

在這里插入圖片描述

有幾點說明:
(1)共用體變量的引用方式。和結構體很類似,不能直接引用共用體變量,只能引用共用體變量中的成員,如a.cname、a.carnum,要知道,a對應的內存空間中有好幾種不同類型的成員,每個成員占的內存大小都可能不同,所以必須明確寫明引用的成員。
(2)共用體變量的特點。同一段內存中存放幾個不同類型的成員,但每一個瞬間只能存放其中一個,換句話說,每個瞬間只能有一個成員起作用,其他成員不起作用。
程序中最后給哪個成員賦值,哪個成員就起作用。看如下代碼:
在這里插入圖片描述
所以,使用共用體變量時必須時刻注意當前存放在其中的數據,明確知道哪個成員當前正在起作用。

(3)共用體變量地址和其成員的地址都相同。也就是說,&a、&a.carnum、&a.cartype、&a.cname所代表的首地址都相同,共用體變量名也代表共用體變量的首地址,這一點與數組名代表數組首地址的說法類似。
(4)共用體變量不能在定義的時候給所有成員都進行初始化。看如下代碼:
在這里插入圖片描述
但是在定義的時候初始化第一個成員是允許的。看如下代碼:
在這里插入圖片描述

枚舉類型

如何理解枚舉類型?例如有4種顏色,分別是紅色、綠色、藍色、黃色,現在想表示這4種顏色,可以約定用數字來表示,如約定0表示紅色,1表示綠色,2表示藍色,3表示黃色,這當然可以,但0、1、2、3這樣的數字看起來很不直觀,如果能夠用一些英文單詞如用Red表示紅色,Green表示綠色,Blue表示藍色,Yellow表示黃色,更直觀、更容易讓人看懂,此時枚舉類型就能發揮作用。看看怎樣用枚舉類型來定義這些顏色,代碼如下:

enum color	//color是枚舉類型名
{Red,	//值Green,Blue,Yellow
};

這樣就定義了一個名字叫作color的枚舉類型,因為這是個類型,定義完之后,就可以使用這個類型了。看看如下代碼:
在這里插入圖片描述

有幾點說明:(1)枚舉,就是將值一一列舉出來,那么上面的變量mycolor1、mycolor2的值只限于列舉出來的這些值的范圍內,也就是Red、Green、Blue、Yellow之一(當然后續還有mycolor1、mycolor2不限于這些值范圍的講述,后續再說)。例如:
在這里插入圖片描述

(2)可以直接定義枚舉類型變量,不需要寫枚舉類型名。看看如下代碼:
在這里插入圖片描述

(3)Red、Green、Blue、Yellow,這些叫作枚舉常量,記住,它們是常量,用來給枚舉型變量賦值,那么這些枚舉型常量所代表的值是多少呢?C語言編譯器會按照它們定義時的順序規定它們的值,并且值是從0開始,這說明,Red等于0、Green等于1、Blue等于2、Yellow等于3。看看如下代碼:
在這里插入圖片描述
(4)可以直接給枚舉型變量賦值。看看如下代碼:
在這里插入圖片描述

(5)定義枚舉類型時,可以改變默認的枚舉常量的值(默認的枚舉常量值前面說過是從0開始)。看看如下代碼:
在這里插入圖片描述

(6)枚舉值,可以理解為整型值,只是在實際寫代碼時,有時寫枚舉值更容易讓人懂,但不能把一個整數直接賦給一個枚舉變量。看看如下代碼:
在這里插入圖片描述
但用強制類型轉換是可以的:
在這里插入圖片描述
這可能讓人好奇,1000這個數字并不對應于枚舉類型color中的任何一個枚舉型常量值,但像上面這樣寫代碼依然沒有任何問題,mycolor1被成功賦予1000這個值,這進一步證明,枚舉值其實是可以和整型值互通使用的。
此外,枚舉值也可以進行比較判斷操作:
在這里插入圖片描述
(7)枚舉值可以賦值給一個整型變量。看看如下代碼:
在這里插入圖片描述

用typedef定義類型

以往,代碼中用的類型名都是C語言提供的標準類型名,如int、char、float、double等,當然,結構體、共用體、枚舉類型等可以自己命名。此外,還可以用typedef關鍵字來定義新的類型名以代替已有的類型名。注意,typedef是用來定義新類型名的,不是用來定義變量的。看看如下代碼:
在這里插入圖片描述
這相當于用INTEGER代表了int,那么定義整型變量就可以這樣定義:
在這里插入圖片描述
也可以用typedef定義一個結構體類型:
在這里插入圖片描述

上面這段代碼定義了一個新的類型名DATE(不是定義結構體變量,因為前面有typedef關鍵字),代表上面定義的這個結構體類型。現在,可以用DATA來定義變量了。看看如下代碼:
在這里插入圖片描述

針對typedef的用法,還有一些變形,這些變形可以適當記一記,以后也許會遇到:
在這里插入圖片描述

這里有一些重要說明,請注意:
(1)習慣上把用typedef定義的類型名用大寫字母表示,以便區別于C語言提供的標準類型標識符,如int、char等。
(2)typedef是用來定義各種類型名的,不是用來定義變量的,這一點一定不能搞錯。
(3)typedef只是對已經存在的類型增加一個類型名(相當于給類型起一個別名),并沒有創造新類型。
(4)typedef是編譯時處理的。
一個項目可以由一個或者多個源程序文件組成,一個項目可以通過編譯、鏈接最終形成一個可執行文件。而編譯這個步驟可以拆開來看,它實際也是做了好幾件事情,包括:
· 預處理:#define、#include、#ifdef;
· 編譯:詞法和語法分析、目標代碼生成、優化、typedef;
· 匯編:產生.o(.obj)目標文件。

(5)typedef最主要的作用是什么?其最主要的作用是有利于程序的通用性與可移植性。
例如以往這樣定義int型變量:
在這里插入圖片描述

將來如果想將所有int型變量都變成long型變量,就得找到所有int型變量定義的位置并逐個修改。但如果這樣寫代碼定義,首先用一個typedef,如下所示:
在這里插入圖片描述
然后在定義整型變量時不使用int來定義,而是使用INTEGER來定義。例如:

在這里插入圖片描述
那以后若需要把int修改為long,只需要修改typedef這一行。例如:
在這里插入圖片描述
這樣所有的int類型變量就都被修改為long類型。

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

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

相關文章

idea 轉換為 Maven Project 的方法

選項: Add as Maven Project

通過TightVNC遠程訪問MacOS

目錄 一、下載 TightVNC 下載鏈接:https://www.tightvnc.com/ 下載后按步驟進行安裝,安裝完成后安裝目錄如下: 運行 tvnviewer.exe,輸入遠程 IP,點擊【connect】: 輸入密碼,點擊【OK】后即可遠…

Matlab中圖例的位置(圖例放在圖的上方、下方、左方、右方、圖外面)等

一、圖例默認位置 默認的位置在NorthEast r 10; a 0; b 0; t0:0.1:2.1*pi; xar*cos(t); ybr*sin(t); A1plot(x,y,r,linewidth,4);%圓 hold on axis equal A2plot([0 0],[1 10],b,linewidth,4);%直線 legend([A1,A2],圓形,line)二、通過Location對legend的位置進行改變 變…

企業電子招投標采購系統源碼之電子招投標的組成 tbms

? 功能模塊: 待辦消息,招標公告,中標公告,信息發布 描述: 全過程數字化采購管理,打造從供應商管理到采購招投標、采購合同、采購執行的全過程數字化管理。通供應商門戶具備內外協同的能力,為…

設計模式-觀察者模式(觀察者模式的需求衍變過程詳解,關于監聽的理解)

目錄 前言概念你有過這樣的問題嗎? 詳細介紹原理:應用場景: 實現方式:類圖代碼 問題回答監聽,為什么叫監聽,具體代碼是哪觀察者模式的需求衍變過程觀察者是為什么是行為型 總結: 前言 在軟件設計…

【C++類和對象】類有哪些默認成員函數呢?(下)

文章目錄 一、類的6個默認成員函數二、日期類的實現2.1 運算符重載部分2.2 日期之間的運算2.3 整體代碼1.Date.h部分2. Date.cpp部分 三. const成員函數四. 取地址及const取地址操作符重載擴展內容 總結 ヾ(????)ノ" 人總要為過去的懶惰而付出代價ヾ(???…

2011年下半年 軟件設計師 上午試卷2

博主介紹:?全網粉絲3W,全棧開發工程師,從事多年軟件開發,在大廠呆過。持有軟件中級、六級等證書。可提供微服務項目搭建與畢業項目實戰,博主也曾寫過優秀論文,查重率極低,在這方面有豐富的經驗…

如何為你的表單添加一個反選功能

原始代碼 無標題文檔 <form id"form1" name"form1" method"post" action""><table width"50%" border"1" cellspacing"0" cellpadding"0"><tr><td bgcolor"#9999…

數據包如何游走于 Iptables 規則之間?

在前文《Linux路由三大件》中&#xff0c;我們提到了 iptables 可以修改數據包的特征從而影響其路由。這個功能無論是傳統場景下的 防火墻&#xff0c;還是云原生場景下的 服務路由&#xff08;k8s service&#xff09;、網絡策略(calico network policy) 等都有依賴。 雖然業…

ceph數據分布

ceph的存儲是無主結構&#xff0c;數據分布依賴client來計算&#xff0c;有兩個條主要路徑。 1、數據到PG 2、PG 到OSD 有兩個假設&#xff1a; 第一&#xff0c;pg的數量穩定&#xff0c;可以認為保持不變&#xff1b; 第二&#xff0c; OSD的數量可以增減&#xff0c;OSD的…

基于Java的深圳坂田附近閑置物品交易群管理系統

開發技術&#xff1a;java 開發框架&#xff1a;springmvc、spring、mybatis 數據庫&#xff1a;mysql 備注&#xff1a;方便大家將手中的二手閑置物品轉讓給需要的人&#xff0c;例如大家搬家的時候&#xff0c;有不要的&#xff08;冰箱、洗衣機、桌子、椅子&#xff09;等物…

RISC-V 整型通用寄存器介紹

簡介 RISC-V64位/32位提供了32個整型通用寄存器&#xff0c;編號是x0~x31&#xff0c;這些整型通用寄存器的寬度與架構位數一致。 浮點數寄存器與整形寄存器一樣也提供了32個&#xff1a;f0~f31&#xff0c;位數與架構位數一致。 通用寄存器介紹 零寄存器 x0/zero x0寄存…

力扣:65. 有效數字(Python3)

題目&#xff1a; 有效數字&#xff08;按順序&#xff09;可以分成以下幾個部分&#xff1a; 一個 小數 或者 整數&#xff08;可選&#xff09;一個 e 或 E &#xff0c;后面跟著一個 整數 小數&#xff08;按順序&#xff09;可以分成以下幾個部分&#xff1a; &#xff08;…

一、進入sql環境,以及sql的查詢、新建、刪除、使用

1、進入sql環境 》》》mysql -u root -p 》》》輸入密碼 2、sql語言的分類 3、注意事項&#xff1a; 4、基礎操作&#xff1a; &#xff08;1&#xff09;查詢所有數據庫&#xff1a; show databases; 運行結果&#xff1a; &#xff08;2&#xff09;創建一個新的數據庫&…

CSS練習

CSS練習 工具代碼運行結果 工具 HBuilder X 代碼 <!DOCTYPE html> <!-- 做一個表格&#xff0c;6行4列實現隔行換色&#xff08;背景色&#xff09;并且第3列文字紅色第一個單元格文字大小30px。最后一個單元格文字加粗--> <html><head><meta ch…

初階C語言-結構體

&#x1f31e; “少年有夢不至于心動&#xff0c;更要付諸行動。” 今天我們一起學習一下結構體的相關內容&#xff01; 結構體 &#x1f388;1.結構體的聲明1.1結構的基礎知識1.2結構的聲明1.3結構成員的類型1.4結構體變量的定義和初始化 &#x1f388;2.結構體成員的訪問2.1結…

自然語言處理從入門到應用——LangChain:記憶(Memory)-[自定義對話記憶與自定義記憶類]

分類目錄&#xff1a;《自然語言處理從入門到應用》總目錄 自定義對話記憶 本節介紹了幾種自定義對話記憶的方法&#xff1a; from langchain.llms import OpenAI from langchain.chains import ConversationChain from langchain.memory import ConversationBufferMemoryllm…

QT 使用第三方庫QtXlsx操作Excel表

1.簡介 一直以來&#xff0c;都想學習一下C/C如何操作excel表&#xff0c;在網上調研了一下&#xff0c;覺得使用C/C去操作很麻煩&#xff0c;遂轉向QT這邊&#xff1b;QT有一個自帶的類QAxObject&#xff0c;可以使用他去操作&#xff0c;但隨著了解的深入&#xff0c;覺得他…

c++游戲制作指南(四):c++實現數據的存儲和讀取(輸入流fstream)

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;歡迎來到靜淵隱者的csdn博文&#xff0c;本文是c游戲制作指南的一部&#x1f35f; &#x1f355;更多文章請點擊下方鏈接&#x1f355; &#x1f368; c游戲制作指南&#x1f3…

最長重復子數組(力扣)動態規劃 JAVA

給兩個整數數組 nums1 和 nums2 &#xff0c;返回 兩個數組中 公共的 、長度最長的子數組的長度 。 示例 1&#xff1a; 輸入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 輸出&#xff1a;3 解釋&#xff1a;長度最長的公共子數組是 [3,2,1] 。 示例 2&#xff1a; 輸…