如何系統學習C 語言(中)之 結構體篇
1,結構體
在前面我們知道變數和陣列都可以用來儲存資料,變數用來儲存單個數據,陣列可以用來儲存一組同類型的資料,但你有沒有發現——它們都只適合單一屬性的資料。那現實生活中,很多物件都是具有多屬性的。例如一個人,都具有姓名、年齡、身高、體重等各種屬性。那該如何是好呢?
別急,C語言中的結構體屬於複合型別,它是其他資料型別構造出的一個新資料型別。結構體可以擁有眾多的成員,而且各成員的資料型別可以各不相同。因此,它是非常適合擁有多屬性的物件進行儲存。
Ⅰ,結構體型別的定義
定義格式為:
struct 結構體型別名{ 資料型別 成員名; 資料型別 成員名; ... }; //特別注意此處的分號不要遺忘
下面試著定義關於人的結構體型別,例如:
struct Person{
char name[20]; //姓名
int age; //年齡
float height; //身高
float weight; //體重
};
特別注意,上面定義的是一個結構體型別,它是不能用於儲存資料的。就好像int 是一個數據型別,它是不能儲存資料一樣。如果要儲存資料需要再定義出該型別的變數,如:
int a;
下面就說一下如何定義結構體型別的變數。
Ⅱ,結構體變數的定義
1,先定義結構體型別,再定義結構體變數,例如:
struct Person p1; //注意:這條語句是定義了struct Person 型別的變數p1。也就是說,結構體型別不光是型別名字本身,前面還需加上“struct”關鍵字。
2,在定義結構體型別的同時定義結構體變數,例如:
struct Person{
char name[20]; //姓名
int age; //年齡
float height; //身高
float weight; //體重
} p2;
3,定義無名結構體型別變數,例如:
struct {
char name[20]; //姓名
int age; //年齡
float height; //身高
float weight; //體重
} p3;
Ⅲ,結構體變數的初始化與賦值
再定義結構體變數時,可以對其進行初始化。結構體變數的初始化方式與陣列類似,使用大括號將初始值列表括起來。不過,列表中初始值的型別和順序要與結構體成員的型別和順序匹配。例如:
struct Person p1 = {"Tom",20,1.70f,60.1f};
Ⅳ,結構體成員的訪問
C語言中,使用成員訪問運算子(“.”)來訪問結構體變數的各成員,我們常說的點運算說的就是它了:
結構體變數名.成員名
Ⅴ,結構體的大小
基本資料型別都有相對固定的大小,而結構體是符合資料型別,它的成員的型別、數量都是不固定的,但我們可以通過sizeof運算子來獲取結構體的大小,例如:
printf("Size of the struct Person: %u bytes.\n",sizeof(struct Person));
Ⅵ,結構體的巢狀
C語言中可以將一個結構體作為另外一個結構體的成員,即允許結構體的巢狀使用,如下例子:
//定義一個日期的結構體型別Date
struct Date{
short year;
short month;
short day;
};
//然後再Person的結構體中再新增一個Date結構體型別的成員birthday,用來表示人的生日
struct {
char name[20];
int age;
float height;
float weight;
struct Date birthday; //生日
} ;
//初始化如下:
struct Person ls={"lisi",20,1.52,45.5,{1999,8,28}};
//訪問birthday中的成員如下方式
ls.birthday.year;
ls.birthday.month;
2,結構體的運用
上面介紹了結構體型別與結構體變數之後,下面我們就要學著運用它了。不要讓結構體孤零零的存在,要讓它發揮應用的作用,應該讓它與指標、陣列、函式等結合起來,只有這樣我們的程式碼才會靈活、高效、優美。
至於江湖中結構體與指標、結構體與陣列、結構體與函式以及結構體與字串的打打殺殺,亦或是人情世故,就留給我們自己到江湖上去體會吧!