【c基礎】資料類型–結構和聯合

來源:互聯網
上載者:User
一、結構彙總資料類型能夠同時儲存超過一個的單獨資料。c提供了兩種彙總資料類型: 數組和結構數組是相同類型的元素的集合,它的每個元素是通過下標引用或指標間接訪問來選擇的。結構可以儲存不同的類型值,這些值為它的成員,成員是通過名字訪問的。
結構聲明eg.1: struct SIMPLE {int a;char b;float c;};struct SIMPLE x, y[20], *z;

eg.2: typedef struct {int a;char b;float c;} Simple;Simple x, y[20], *z;
訪問結構成員:eg:x.a;// 直接存取,x是結構名
z->a;// 間接訪問,z是指向結構的指標
結構初始化類似與數組的初始化
結構的儲存分配:編譯器按照成員列表順序給每個成員分配記憶體,只有當儲存成員時需要滿足正確的邊界對其要求時,成員之前才可能出現用於填充的額外記憶體空間。
通常情況下,作為函數參數的結構,參數應該設為結構指標,若不改變結構成員,使用關鍵字const。eg:void f( register Simple const *z )二、聯合聯合的聲明和結構類似,但行為方式卻和結構不同。聯合的所有成員引用的是記憶體中的相同位置。
聯合的長度就是它最長成員的長度。當成員長度差異大時,更好的方法是在聯合中儲存指向不同成員的指標而不是直接儲存成員本身。(先存指標,用時再動態分配記憶體以節省記憶體空間。)
初始化:必須是聯合的第一個成員類型,而且必須位於花括弧裡。eg:unio  {inta;floata;charc[4];}  x = { 5 };     // x.a初始化為5
三、總結

在結構(struct)中,不同類型的值可以儲存在一起。結構中的值稱為成員,他們是通過名字訪問的。結構變數是一個標量,可以出現在普通標量中可以出現的任何場合。


結構的聲明列出了結構包含的成員列表。不同的結構聲明即使他們的成員列表相同也被認為是不同類型的。結構標籤是一個名字,它與一個成員列表相關聯。你可以使用結構標籤在不同的聲明中建立相同類型的結構變數,這樣就不用每次在聲明中重複成員列表。typedef 也可以用於實現這個目標。


結構的成員可以使標量、數組或指標。結構也可以包含本身也是結構的成員。在不同的結構中出現同樣的成員是不會引起衝突的。你使用點操作符訪問結構變數的成員。如果你擁有一個指向結構的指標,你可以使用箭頭操作符訪問這個結構的成員。


結構不能包含類型也是這個結構的成員,但它的成員可以是一個指向這個結構的指標。這個技巧常常用於鏈式資料結構中。為了聲明兩個結構,每個結構都包含一個指向對方的指標的成員,我們需要使用不完整的聲明來定義一個結構標籤名。結構變數可以用一個由花括弧包圍的值列表進行初始化。這些值的類型必須適合它所初始化的那些成員。


編譯器為一個結構變數的成員分配記憶體時要滿足它們的邊界對齊要求。在實現結構儲存的邊界對齊時,可能會浪費一部分記憶體空間。根據邊界對齊要求降序排列結構成員可以最大限度地減少結構儲存中浪費的記憶體空間。sizeof 返回的值包含了結構中浪費的記憶體空間。


 結構可以作為參數傳遞給函數,也可以作為傳回值從函數返回。但是,向函數傳遞的一個指向結構的指標往往效率更高。在結構指標參數的聲明中可以加上const 關鍵字防止函數修改指標所指向的結構。


位段是結構的一種,但它的成員長度以位為單位指定。位段聲明在本質上是不可移植的,因為它涉及許多與實現有關的因素。但是,位段允許你把長度為奇數的值封裝在一起以節省儲存空間。原始碼如果需要訪問一個值內部任意的一些位,使用位段比較簡便。


 一個聯合的所有成員都儲存於同一個記憶體位置。通過訪問不同類型的聯合成員,記憶體中相同的位組合可以解釋為不用的東西。聯合在實現變體記錄時很有用,但程式員必須負責確認實際儲存的是哪個變體並選擇正確的聯合成語以便訪問資料。聯合變數也可以進行初始化,但初始化值必須與聯合第1個成員的類型匹配,而且它必須位於一對花括弧裡面。在聯合中儲存指向不同成員的指標而不是直接儲存成員本身,可以解決記憶體浪費問題。


想函數傳遞結構參數是低效的,應該用指向結構的指標傳遞參數。把結構體標籤聲明和結構的typedef 聲明放在標頭檔中,當源檔案需要這些聲明時可以通過#include 指令把他們包含進來。把位段成員顯示聲明為signed int 或unsigned int 類型。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.