C语言程序设计 | 结构体,枚举,联合
目錄:
- 結(jié)構(gòu)體
- 枚舉
- 聯(lián)合
結(jié)構(gòu)體
結(jié)構(gòu)是一些值的集合,這些值成為成員變量。結(jié)構(gòu)的每個成員可以是不同類型的變量
結(jié)構(gòu)體的聲明
struct s{char a;int b;}s1;這里的a和b就是結(jié)構(gòu)體的成員變量,s1就是結(jié)構(gòu)體的名字。
當我們在聲明結(jié)構(gòu)體時,可以忽略掉結(jié)構(gòu)體標簽s,進行不完全聲明
struct {char a;int b;}s2;這兩個一樣嗎?雖然它們看上去一樣,但是因為標簽不同,編譯器會將它們當作兩個完全不同的類型。
結(jié)構(gòu)體的自引用
在一個結(jié)構(gòu)體中我們是否可以包含一個這個結(jié)構(gòu)體本身的成員變量呢?
答案是可以的,但是也是有條件的,我們只能引用這個結(jié)構(gòu)體類型的指針
這里s1的寫法就是不允許的,我們只能通過聲明這個結(jié)構(gòu)體類型的指針來實現(xiàn)自引用。
這種用法在我們數(shù)據(jù)結(jié)構(gòu)中的鏈式存儲結(jié)構(gòu)中經(jīng)常可以看到。
同時還有一個需要注意的地方,在聲明結(jié)構(gòu)體時,很多同學(xué)都是使用typedef來重命名結(jié)構(gòu)體,但是如果結(jié)構(gòu)體中存在自引用的話,我們就不能使用重命名后的名字來聲明自引用,因為重命名在結(jié)構(gòu)體內(nèi)部成員成員變量的聲明之后。
結(jié)構(gòu)體的定義和初始化
了解了結(jié)構(gòu)體的基本內(nèi)容,下面來看看如何定義結(jié)構(gòu)體變量。
我們可以在聲明結(jié)構(gòu)體的時候進行定義,也可以單獨進行定義
這里的s1和s2就分別是這兩種方法。
同時我們的初始化也遵循這個原則
同時結(jié)構(gòu)體還是可以嵌套初始化的,只需要內(nèi)部再加一個中括號即可,在這里就不進行演示了。
結(jié)構(gòu)體傳參
之前我在指針那一章中講到過數(shù)組的傳參,而結(jié)構(gòu)體的傳參也與它大同小異。
傳參分為兩種,一種傳地址,一種傳數(shù)值。結(jié)構(gòu)體與數(shù)組不同的地方就在于它是兩種都支持的,
這里的test1是傳整個結(jié)構(gòu)體,test2是傳指針,它們兩個都是可以編譯通過的,但在實際應(yīng)用中我們應(yīng)該選擇第二種,因為在傳參的時候參數(shù)是需要壓棧的,會有時間和空間上的開銷。同時如果傳遞一個結(jié)構(gòu)體對象的時候,結(jié)構(gòu)體過大,參數(shù)壓棧的系統(tǒng)開銷也就越大,會導(dǎo)致性能的下降。
所以當我們在進行結(jié)構(gòu)體傳參的時候應(yīng)該傳結(jié)構(gòu)體的地址
結(jié)構(gòu)體還存在位段和內(nèi)存對齊,因為難以理解所以我單獨發(fā)了一個博客進行講解。
結(jié)構(gòu)體內(nèi)存對齊,位段詳解:https://blog.csdn.net/qq_35423154/article/details/103190437
枚舉
枚舉理解起來十分簡單,就是將可能的取值一一列舉出來
定義的方式
其中的day1-5是枚舉類型的可能取值,也叫枚舉常量
第一項為0, 每次遞增一位,我們可以在定義時給其賦初值。
為什么要使用枚舉呢?
只能拿枚舉常量給枚舉變量賦值,才不會出現(xiàn)類型的差異
聯(lián)合
聯(lián)合也是一種特殊的自定義類型,這種類型定義的變量也包含一系列的成員,特征時這些成員公用一塊空間。
聲明方式
當我們想看它的大小時,發(fā)現(xiàn)又和之前的幾種不一樣了。
這是為什么呢?
如;
因為聯(lián)合體的成員是共用同一塊空間的,所以我們可以利用這個特點,更簡單的來判斷機器的大小端
之前講的方法:https://blog.csdn.net/qq_35423154/article/details/102712686
總結(jié)
以上是生活随笔為你收集整理的C语言程序设计 | 结构体,枚举,联合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言程序设计 | 结构体内存对齐,位段
- 下一篇: C语言程序设计 | 动态内存管理:动态内