標準C程序設計(五)

10 結構體與共用體
   10.1 結構體的定義
   數組可以用來表示一組相同類型的數據項。但是,如果要用一個名稱來表示不同類型的數據集合,就不能用數組了。C語言支持一種結構化的數據類型,稱爲結構體。它是一種封裝不同類型的數據的機制。結構體的概念類似於其他很多語言中“記錄”。
   與數組不同,必須首先定義結構體的格式,然後在聲明結構體的變量。結構體定義和結構體變量創建過程。如下:
   struct book_bank
{
     char title[20];
     char author[15];
     int pages;
     float price;
};
   關鍵字struct聲明一個結構體,該結構體有4個數據字段(即title、author、pages和price)。這些字段稱爲結構體元素或成員,每個成員可以屬於不同的數據類型。book_bank是結構體名,稱爲結構體標記符。隨後就可用標記符名來生命屬於該結構體的變量。
    注意,上面的定義中沒有聲明任何變量,只是描述了一種稱爲模板的格式。
     定義一個結構體時應注意以下語法:
  • 結構體模板以分號結束
  • 整個定義被看做是一條語句,而每個成員則以自己的名稱和類型分別聲明在模板中的單個語句
  • 諸如book_bank的標記符名可在後面的程序中用於聲明結構體變量
數組與結構體區別與聯繫:它們都屬於結構化數據類型,都提供了一種相對簡單的方式來訪問和操作數據。
  • 數組是相同類型的數據元素的集合。而結構體可以有不同類型的元素
  • 數組其實是一個派生的數據類型,而結構體是一種程序員自定義的數據類型
  • 數組就像是C語言內置的一種數據類型。我們所要做的就是聲明一個數組變量,然後就可以直接使用了。但結構體不同,我們首先的設計並聲明一個數據結構,然後才能聲明和使用這種類型的變量。
     10.2 聲明結構體變量
     結構體變量的聲明包括以下部分:關鍵字struct,結構體標記符,由逗號分隔開的變量名列表,終止分號。如:
     struct book_bank book1, book2;
     其中,結構體的成員本身不是變量,他們不佔用任何存儲空間,除非它們與諸如book1之類的結構體變量相關聯。當編譯器遇到聲明語句時,將爲結構體變量保留存儲空間。也可以將結構體定義與變量聲明組合在一條語句之中。
 struct book_bank
{
     char title[20];
     char author[15];
     int pages;
     float price;
} book1, book2;
     這裏的標記符名(book_bank)可要可不要。但是,並不推薦使用這種方法,原因:
  • 由於沒有標記符名,就不能再用它來聲明其他變量了;
  • 通常,結構體定義是出現在程序文件的開頭,位於所有變量或函數定義之前。也可以出現在main和諸如#define之類的宏定義之前。在這些情況下,結構體定義是全局,可以被其他函數使用。
   也可使用關鍵字typedef來定義結構體
typedef struct
{
     char title[20];
     char author[15];
     int pages;
     float price;
} mybook;
mybook表示給一個已經存在的數據類型一個新名字,用來簡化變量聲明。如可以聲明變量mybook book1, book2;
    10.3 結構體的初始化
 C語言不允許對模板中的單個結構體成員進行初始化,必須在實際結構體變量的聲明中初始化。test_38.c
    10.4 共用體
 共用體是從結構體中借來的概念,因此遵循與結構體相似的語法。共用體與結構體兩者之間主要的區別是存儲形式。 
 在結構體中,每個成員有自己的存儲空間,而共用體中的所有成員使用相同的存儲空間。這意味着,儘管共用體可以含有不同的數據類型的多次成員,但一次只能處理一個成員。共用體聲明如下:
union item
{
     int m;
     float x;
     char c;
} code;
   訪問一個共用體成員,可以使用訪問結構體成員相同的語法。即code.m。訪問時,必須確保當前存儲是我們要訪問的成員的值。如以下語句將產生輸出錯誤:
    code.m = 379;
code.x = 324.43;
printf("%d\n", code.m );
共用體只創建一個存儲空間,每次只能被某一成員使用。當某一成員被賦予一個新值時,該新值將替代掉前一成員的值。
     當聲明變量時,可以對共用體進行初始化。但是,與結構體不同的是,只能用與第一個共用體成員的類型相同的值進行初始化。如unio item code = {100};是合法的,但是,union item code = {10.23};是非法的
    10.5 結構體與共用體存儲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章