C語言定義了很多基本數據類型,當我們需要爲某一變量定義多個不同的數據類型時,我們就用到了結構體。
結構體可以作爲一個變量存放多個不同數據類型的數據,而數組只能存放同數據類型的多個數據。
比如一本書:具有圖書名稱,圖書作者,圖書售價,出版日期,出版社,ISBN號。
基本結構:
struct 結構體名稱
{ 結構體成員1; 結構體成員2; 結構體成員3; ...... };
其中的結構體成員可以是一種基本的數據類型也可以是數組或者另一個結構體。
結構體的聲明:
將書本的各個數據整合成爲結構體的聲明就如下:結構體名稱通常大寫字母開頭。
struct Book
{
char title[128];
char author[40];
float price;
unsigned int date;
char publishter[40];
};
注意,以上爲結構體的聲明,並不會在在內存中真正的申請空間,我們需要對結構體定義才能使用結構體。
定義結構體類型變量: struct 結構體名稱 結構體變量名
結構體的定義:
#include <stdio.h>
//聲明結構體
struct Book
{
char title[128];
char author[40];
float price;
unsigned int date;
char publisher[40];
};
struct Bookk
{
char title[128];
char author[40];
float price;
unsigned int date;
char publisher[40];
}bookk;//這裏的bookk也爲定義結構體,函數外的定義爲全局變量
int main(void)
{
//定義結構體,若放在函數裏定義,那麼結構體爲只屬於函數的局部變量
struct Book book;
}
兩種定義方式,區別在於作用域不同。
訪問結構體變量:
點號運算符:(.)--->比如book.title就是引用book結構體的title的成員,它是一個字符數組,而book.price則是引用book結構體的price成員,它是一個浮點型的變量。
#include <stdio.h>
//聲明結構體
struct Book
{
char title[128];
char author[40];
float price;
unsigned int date;
char publisher[40];
} book;//這裏的book也爲定義結構體,函數外的定義爲全局變量
int main(void)
{
printf("請輸入書名:");
scanf("%s", book.title); //引用時爲book.title
printf("請輸入作者:");
scanf("%s", book.author);
printf("請輸入售價:");
scanf("%f", &book.price);
printf("請輸入出版日期:");
scanf("%d", &book.date);
printf("請輸入出版社:");
scanf("%s", book.publisher);
printf("書名:%s\n",book.title);
printf("作者:%s\n", book.author);
printf("售價:%f\n", book.price);
printf("出版日期:%d\n", book.date);
printf("出版社:%s\n", book.publisher);
return 0;
}
初始化結構體變量:
初始化結構體變量與初始化變量與數組一樣,都是在定義時就爲其賦值。注意類型對號入座。
struct Book book = {
"《C語言》",
"abc",
99.9,
19721010,
"出版社"
};
既然在結構體定義時就可以賦值,以下也是正確的賦值方式。
struct Book
{
char title[128];
char author[40];
float price;
unsigned int date;
char publisher[40];
} book = {
"《C語言》",
"abc",
99.9,
19721010,
"出版社"
};
也可以使用(.)運算符初始化指定成員,可以不按順序。
//初始化指定結構體成員
struct Book book = {
.author = "abc",
.price = 99.9
};
結構體的內存對齊:
對結構體變量的成員進行數據讀取時,編譯器爲方便快速讀取,會對結構體成員進行內存對齊,會導致佔用空間加大。
比如 char-int-char所佔內存字節爲1-4-1,編譯器爲方便快速讀取,使每個成員數據內存強行相等,32位系統常對其爲4字節,使內存分佈爲4-4-4,總共佔用12字節。其實對齊後的內存空間只有第一個字節存儲char類型的數據,其餘三字節爲空,第三個同理。爲避免內存對齊造成內存浪費,所以我們對結構體聲明和定義成員變量時,可以變爲char-char-int,這樣前兩個char對齊時共用一個對齊後的四字節內存,雖然有兩個字節浪費,相比之前也避免了浪費。