聚合資料型別能夠同時儲存超過乙個的單獨資料。c提供了兩種聚合資料型別:陣列和結構
陣列是相同型別的元素的集合,它的每個元素是通過下標引用或指標間接訪問來選擇的。
結構可以儲存不同的型別值,這些值為它的成員,成員是通過名字訪問的。
結構宣告
eg.1:struct ****** ;
struct ****** x, y[20], *z;
eg.2:typedef struct ******;
****** x, y[20], *z;
訪問結構成員:
eg:x.a;// 直接訪問,x是結構名
z->a;// 間接訪問,z是指向結構的指標
結構初始化類似與陣列的初始化
結構的儲存分配:編譯器按照成員列表順序給每個成員分配記憶體,只有當儲存成員時需要滿足正確的邊界對其要求時,成員之前才可能出現用於填充的額外記憶體空間。
通常情況下,作為函式引數的結構,引數應該設為結構指標,若不改變結構成員,使用關鍵字const。
eg:void f( register ****** const *z )
聯合的宣告和結構類似,但行為方式卻和結構不同。聯合的所有成員引用的是記憶體中的相同位置。
聯合的長度就是它最長成員的長度。當成員長度差異大時,更好的方法是在聯合中儲存指向不同成員的指標而不是直接儲存成員本身。(先存指標,用時再動態分配記憶體以節省記憶體空間。)
初始化:必須是聯合的第乙個成員型別,而且必須位於花括號裡。
eg:unio x = ;
// x.a初始化為5
在結構(struct)中,不同型別的值可以儲存在一起。結構中的值稱為成員,他們是通過名字訪問的。結構變數是乙個標量,可以出現在普通標量中可以出現的任何場合。
結構的宣告列出了結構包含的成員列表。不同的結構宣告即使他們的成員列表相同也被認為是不同型別的。結構標籤是乙個名字,它與乙個成員列表相關聯。你可以使用結構標籤在不同的宣告中建立相同型別的結構變數,這樣就不用每次在宣告中重複成員列表。typedef 也可以用於實現這個目標。
結構的成員可以使標量、陣列或指標。結構也可以包含本身也是結構的成員。在不同的結構中出現同樣的成員是不會引起衝突的。你使用點操作符訪問結構變數的成員。如果你擁有乙個指向結構的指標,你可以使用箭頭操作符訪問這個結構的成員。
結構不能包含型別也是這個結構的成員,但它的成員可以是乙個指向這個結構的指標。這個技巧常常用於鏈式資料結構中。為了宣告兩個結構,每個結構都包含乙個指向對方的指標的成員,我們需要使用不完整的宣告來定義乙個結構標籤名。結構變數可以用乙個由花括號包圍的值列表進行初始化。這些值的型別必須適合它所初始化的那些成員。
編譯器為乙個結構變數的成員分配記憶體時要滿足它們的邊界對齊要求。在實現結構儲存的邊界對齊時,可能會浪費一部分記憶體空間。根據邊界對齊要求降序排列結構成員可以最大限度地減少結構儲存中浪費的記憶體空間。sizeof 返回的值包含了結構中浪費的記憶體空間。
結構可以作為引數傳遞給函式,也可以作為返回值從函式返回。但是,向函式傳遞的乙個指向結構的指標往往效率更高。在結構指標引數的宣告中可以加上const 關鍵字防止函式修改指標所指向的結構。
位段是結構的一種,但它的成員長度以位為單位指定。位段宣告在本質上是不可移植的,因為它涉及許多與實現有關的因素。但是,位段允許你把長度為奇數的值包裝在一起以節省儲存空間。源**如果需要訪問乙個值內部任意的一些位,使用位段比較簡便。
乙個聯合的所有成員都儲存於同乙個記憶體位置。通過訪問不同型別的聯合成員,記憶體中相同的位組合可以解釋為不用的東西。聯合在實現變體記錄時很有用,但程式設計師必須負責確認實際儲存的是哪個變體並選擇正確的聯合成語以便訪問資料。聯合變數也可以進行初始化,但初始化值必須與聯合第1個成員的型別匹配,而且它必須位於一對花括號裡面。在聯合中儲存指向不同成員的指標而不是直接儲存成員本身,可以解決記憶體浪費問題。
想函式傳遞結構引數是低效的,應該用指向結構的指標傳遞引數。把結構體標籤宣告和結構的typedef 宣告放在標頭檔案中,當原始檔需要這些宣告時可以通過#include 指令把他們包含進來。把位段成員顯示宣告為signed int 或unsigned int 型別。
C語言基礎資料型別 結構體和聯合體的區別
在c語言中結構體是這樣定義的 union structdata t 聯合體是這樣定義的 union datadata t 但是他們的功能完全不同 include include union datadata t int main 執行結果 sizeof float 4 sizeof data t 4...
c 基礎(一) 資料型別和結構
1.map maprankdict 定義map rankdict 1 5 rankdict 2 6 map賦值 int dictsize rankdict.size map的大小 cout dictsize iterator iter for iter rankdict.begin iter ran...
C結構和其他資料型別
1 結構宣告和變數宣告 struct name struct name val 列 宣告變數 struct book library 簡化宣告變數 struct book library 初始化結構體 struct book library 指定初始化器 struct book surprise 2...