結構的成員可能具有不同的型別.而且,每個結構成員都有名字,所以為了選擇特定的結構成員需要指明結構成員的名字而不是他的位置.
和陣列一樣,結構變數也可以在宣告的同時進行初始化.為了對結構進行初始化,要把待儲存到結構中的值的列表準備好並用花括號括起來.
初始化式中的值必須按照結構成員的順序進行顯示,
結構初始化式遵循的原則類似於陣列初始化式的原則.用於結構初始化的表示式必須是常量.
同陣列一樣,結構最常見的操作就是選擇結構成員,但是結構成員是通過名字而不是通過位置訪問的.
為了訪問結構內的成員,首先寫出結構的名字,然後寫乙個句點,再寫出成員的名字.
結構的成員是左值,它們可以出現在複製運算的左側,也可以作為自增自減表示式的運算元.
陣列不能用=運算子進行複製,但是結構可以.並且對結構進行複製時,嵌在結構內的陣列也得到了複製.運算子=僅僅用於型別相容的結構.特別是不能使用運算子==和!=來判斷兩個結構相等還是不相等.
c語言提供了兩種結構命名的方法:可以宣告"結構標記",也可以使用typedef來定義型別名.
1.第乙個成員在於結構體變數偏移量為0的位址處.
2.其他成員變數要對齊到某個數字(對齊數)的整數倍處.對齊數 = 編譯器預設的乙個對齊數與該成員大小的較小值.vs中預設的值為8,linux中的預設值為4.
3.結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍.
4.如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍.
1.平台原因: 不是所有的硬體平台都能訪問任意位址上的任意資料,某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常.
2.效能原因: 資料結構(尤其是棧)應盡可能的在自然邊界上對齊.原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問,而對齊的記憶體訪問僅需要一次訪問.
總體來說,結構體的記憶體對齊是拿空間換時間.
結構在對齊方式不合適時,我們可以自己更改預設對齊數,
位段的宣告與結構是類似的,有兩個不同:
1. 位段的成員必須是int, unsigned int或signed int
2. 位段的成員名後邊有乙個冒號和乙個數字
1. 位段的成員可以是 int, unsigned int, signed int, char型別
2. 位段的空間上是按照需要以4個位元組(int)或者乙個位元組(char)的方式來開闢的
3. 位段涉及很多不確定因素,位段數不跨平台的,注重可移植的程式應該避免使用位段
1. int位段被當成有符號數還是無符號數是不確定的
2. 位段中的成員在記憶體中從左到右分配還是從右到左分配標準尚未定義
3. 位段中的最大位的數目不能確定
4. 當乙個結構體包含兩個位段,第二個位段成員比較大,無法容納於第乙個位段剩餘的位時,是捨棄剩餘的位還是利用,這是不確定的
總結: 跟結構相比,位段可以達到同樣的效果,但是可以很好的節省空間,但是有跨平台的問題存在
像結構一樣,聯合也是由乙個或多個成員構成的,而且這些成員可能具有不同的型別.但是,編譯器只為聯合中的最大成員分配足夠的記憶體空間.聯合的成員在這個空間內彼此覆蓋.這樣的結果是,給乙個成員賦予新值也會改變其他成員的值.
1. 聯合的大小至少是最大成員的大小
2. 當最大成員大小不是最大對齊數的整數倍時,就要對齊到最大對齊數的整數倍
列舉顧名思義就是------列舉
c語言為具有可能值較少的變數提供了一種專用型別.列舉型別是一種值由程式設計師列出的型別,而且程式設計師必須為每個值命名.
雖然列舉和結構,聯合沒有什麼共同的地方,但是他們的宣告方法很類似.但是,與結構或聯合的成員不同,列舉常量的名字必須不同於作用域範圍內宣告的其它識別符號
列舉常量類似於用#define指令建立的常量,但是兩者又不完全一樣.特別地,列舉常量遵循c語言的作用域規則: 如果列舉宣告在函式體內,那麼它的常量對於外部函式來說是不可見的.
自定義型別 結構體 列舉 聯合
結構體 所謂結構體,就是將一大堆值放在一起,建立乙個新的型別,這些成員可以是不同型別的變數。struct tag variable list tag 要求 1.見名知意 2.可以省略 3.不建議省略 member list c語言中,不能為空 variable list 變數列表,可以省略,建議省略...
自定義型別 結構體,列舉,聯合
首先先說一下c語言的資料型別,其框架型別如圖所示 今天主要說一下結構體,列舉,聯合這三種自定義型別。1,結構體 1.1 結構體的宣告 結構體是一些值的集合,這些值稱為成員變數,結構體的每個成員可以是不同型別得變數。1 結構體的成員 結構體的成員可以是標量,陣列,指標,甚至是其他結構體。2 結構體的宣...
自定義型別 結構體,列舉,聯合
結構體的宣告 struct tag variable list 例如描述乙個學生 struct stu 分號不能丟特殊的宣告 在宣告結構的時候,可以不完全的宣告。比如 匿名結構體型別 struct x struct a 20 p 警告 編譯器會把上面的兩個宣告當成完全不同的兩個型別。所以是非法的。結...