[C/C++]詳解結構體

引子

設計程序時,最重要的步驟之一就是選擇表示數據的方法。在許多狀況下,簡單變量甚至是數組還不夠。爲此,C提供告終構變量(structure variable)提升表示數據的能力,它可以創造新的形式。數組

創建結構體聲明

小栗子

需求:須要打印一份圖書目錄。裏面包含每本書的各類信息:書名、做者、出版社、版權日期和價格。其中一些元素(例如書名和做者)能夠儲存在字符數組中,其餘項目須要一個int或者float。若是使用5哥不一樣的數組分別記錄每一項都比較繁瑣,尤爲是要建立多份列表:一份按書名排序、一份按做者排序、一份按照價格排序等。若是能把圖書目錄的信息都包含在一個數組裏更好,其中每一個元素包含一本書的相關信息。函數

所以,就須要一種既能包含字符串也能包含數字的數據形式,並且還要保持各信息的獨立。結構體就知足這種狀況下的需求。佈局

struct Book { /* 結構體模板:標記爲Book (咱們一般使用首字母大寫的方式來標識結構體) */
    char title[128]; // 成員 or 字段
    char author[40];
    char publisher[256];
    int date;
    float price;
}
​
int main (void) {
    struct Book book; /* 把book聲明爲一個Book類型的變量 */
    printf("請輸入書名:");
    scanf("%s", book.title);
    printf("請輸入做者:");
    scanf("%s", book.author);
    printf("請輸入出版社:");
    scanf("%s", book.publisher);
    printf("請輸入出版日期:");
    scanf("%d", book.date);
    printf("請輸入價格:");
    scanf("%f", book.price);
    
    return 0;
}
​
// Output
請輸入書名:《C Primer Plus》
請輸入做者:Stephen Prata
請輸入出版社:人民郵電出版社
請輸入出版日期:201604
請輸入價格:59.4

創建結構聲明

結構聲明(structure declaration)描述了一個結構的組織布局。聲明相似下面這樣:設計

struct Book {
    char title[128];
    char author[40];
    float price;
}

該聲明描述了一個由兩個字符數組和一個float類型變量組成的結構。該聲明並未建立實際的數據對象,只描述了該對象由什麼組成。code

分析下,首先是關鍵字struct,它代表跟在其後的是一個結構,後面是一個標記 (例子爲Book),咱們可使用該標記引用該結構。因此,咱們能夠在後面的程序中這樣聲明:對象

struct Book book1;

這把book1聲明爲一個使用Book結構佈局的結構變量。排序

在結構聲明中,用一對花括號括起來的是結構成員列表。每一個成員都用本身的聲明來描述。例如,title部分就是一個內涵128個元素的char類型的數組。成員能夠是任意一種C的數據類型,甚至能夠是其餘結構體。右花括號後面的分號是聲明所必需的,表示結構佈局定義結束。能夠把這個聲明放在全部函數的外部,也能夠放在一個函數定義的內部。若是把結構聲明置於一個函數的內部,它的標記就只限於該函數內部使用。若是置於外部,那麼該聲明以後的全部函數都能使用標記。字符串

定義結構變量

結構有兩層含義。一層含義是「結構佈局」,結構佈局告訴編譯器如何表示數據,可是它並未讓編譯器爲數據分配空間。下一步是建立一個結構變量,便是結構的另外一層含義。編譯器

struct Book book1; // 建立結構變量

初始化結構體

初始化變量和數組以下:it

int count = 0;

int array[7] = {0, 1, 2, 3, 4, 5, 6};

結構變量也能夠像這樣進行初始化,初始化一個結構變量與初始化數組的語法相似:

struct Book book1 = {
    "C Primer Plus",
    "Stephen Prata",
    59.4
};

咱們使用在一對花括號中括起來的初始化列表進行初始化,各初始化項用逗號分隔。所以,title成員能夠被初始化爲一個字符串,price能夠被初始化爲一個數字。爲了讓初始化項與結構中各成員的關聯更加明顯,咱們讓每一個成員的初始化項都獨佔同樣。這樣作只是爲了提升代碼的可讀性,對編譯器而言,只須要用逗號分隔各成員的初始化項便可。

訪問結構體成員

結構相似於一個「超級數組」,這個超級數組中,能夠是一個元素爲char類型,下一個元素爲float類型,下一個元素爲int數組。能夠經過數組下標單獨訪問數組中的個元素,那麼,如何訪問結構中的成員?使用結構成員運算符 點 (.) 訪問結構中的成員。例如,book1.price即訪問book1的price元素。能夠像使用任何float類型變量那樣使用book1.price。與此相似,能夠像使用字符數組那樣使用 book1.title。

本質上,.title、.author和.price的做用至關因而Book結構的下標。

因此在初始化結構體變量時,也能夠指定成員:

struct Book book1 = {.price = 59.4};

既然已是指定成員賦值了,那麼就不用再考慮順序:

struct Book book1 = {
    .price = 59.4,
    .title = "C Primer Plus",
    .author = "Stephen Prata"
}
相關文章
相關標籤/搜索