C語言結構體 聯合 位段和列舉知識總結

2021-09-01 17:51:08 字數 2049 閱讀 3099

一、結構體

概述:簡單來說結構體就是一些值的集合,這些值是它的成員,只不過各個成員可能具有不同的型別。

結構體的宣告:一種不完全宣告,一種採用重新命名typedef,再就是標準命名。

不完全宣告:不宣告結構體的tag:就是匿名宣告。

重新命名:將struct student重新命名為student。

標準命名:什麼都不省略。

注意:在同乙個程式中,不同的結構體定義相同型別的相同變數,是不同的變數。

結構體成員:可以是不同型別的變數的集合,也可以只有乙個型別的集合。

結構體成員的訪問:直接訪問:點操作符(.)訪問;間接訪問:->操作符簡稱箭頭操作符。

注意:點操作符的優先順序高於箭頭操作符。

結構體的自引用:結構體自引用自己是非法的,因為包含自己的結構體中還包含自己的結構體,這樣將重複下去永無止境。但在結構體中定義自己的結構 

體指標是合法的,因為編譯器在結構體長度確定之前就已經直到指標的長度,可以這樣說這個指標其實是指向同一種型別的不同結構。

結構體的初始化:其實結構體的初始化和陣列的初始化很像。位於花括號之內,由逗號分隔的初始化列表。

結構體的儲存分配:存在一種邊界對齊的說法。

2.其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。

對齊數=編譯器預設的乙個對齊數與該成員大小的較小值。vs中預設值為8   inux中預設值為4

3.結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。

4.如果巢狀了結構體,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數的整數倍。

修改預設值:需要預處理指令#pragma,直接在標頭檔案上新增#pragma pack(預設的值)。

邊界對齊的使用:1.盡可能的邊界對齊,為了減少訪問記憶體的次數;2.必要時可以不邊界對齊,為了提高程式的可維護性和可讀性。

結構體的傳參:乙個是傳遞結構體,乙個是傳遞結構體的指標。

結構體:一般情況下,結構體的大小都很大,這時再用結構體傳參就會開銷很大;很小時可以傳遞,效率也很高。

指標:傳遞很大的結構體,用指標可以很大程度的減小開銷,通過對指標的間接訪問就可以得到結構體的值。

二、聯合

概述:聯合的宣告和結構體類似,但行為方式和結構不同,聯合的所有成員引用的是記憶體中的相同的位置。

使用:當需要在不同時刻把不同的東西儲存於同乙個位置時,就可以使用聯合體。

長度:它的長度就是聯合中最長成員的長度。

初始化:必須是聯合第乙個成員的型別,而且它必須位於一對花括號裡。

三、位段

關於結構體還必須知道位段。。

概述:宣告和結構體類似,但是有兩個例外,一是成員必須宣告為int、signed int或unsigned int型別;其次,在成員名後面是乙個冒號和乙個整數,這個整數指定該位所占用的位的數目。

位段的可移植性:可移植性很差,注重可移植性的程式應該避免使用位段,具體原因如下:

1.int位段被當做有符號數還是無符號數是不確定的。

2.位段中最大位的數目不能確定。乙個能夠執行在32位整數的機器上的位段宣告可能在16位整數的機器上無

無法行。

3.位段中的成員在記憶體中是從左到右分配的還是從右到左分配的標準尚未定義。

4.當乙個結構包含兩個位段,第二個位段成員比較大,無法容納於第乙個位段剩餘的位時,是捨棄剩餘的位

還是利用,這是不確定的。

與結構體相比:位段可以達到同樣的效果,同時可以很好的節省空間,但是有跨平台的問題存在。

四、列舉

概述:enum 型別名 {};{}中的內容是列舉型別的可能取值,也叫列舉常量。這些可能取值都是有值得,預設從0開始,依次遞增,一次遞增1,也可以賦初值。

與#define定義常量相比列舉的優點:1.增加**的可讀性和可維護性。

2.和#define定義的識別符號比較列舉有型別檢查,更加嚴謹。

3.防止了命名汙染(封裝)。

4.便於除錯。

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

結構體的基礎知識,位段,聯合 列舉

結構體屬於聚合資料型別,c語言提供了兩種聚合資料型別,陣列和結構體。陣列裡面儲存的是同型別的元素的集合,它的每個元素是通過下標引用或者指標間接訪問來選擇的。結構也是一些值的集合,這些值稱為它的成員,但乙個結構的各個成員可能具有不同的型別,他們需要通過名字去訪問,那個成員都有自己的名字。1.結構宣告 ...

自定義型別(結構體,列舉,聯合,位段)

一.結構體 c語言提供了兩種聚合資料型別,分別為陣列和指標,陣列是相同型別元素的集合,它的每個元素是通過下標引用或指標間接訪問的。結構是不同資料型別的集合,對於結構的訪問不能通過下標去訪問,因為乙個結構的成員可能長度不同。結構並不是它自身成員的陣列,結構變數屬於標量型別。舉例 乙個簡單的結構宣告 s...

結構體,聯合體(共用體),列舉型別,位段,記憶體對齊

struct test 關鍵字 struct,表示其是乙個結構體,後面是乙個可選的標記 test 可以在分號前直接跟變數名,也可以在之後寫為struct test 變數名 strcut test 的作用類似於int 或float的宣告。若寫為 typedef strcut test test 則說明...