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