目前,定製正在變的愈來愈廣泛,定製服務、定製衣服、甚至使用的鍵盤都是定製了。在C語言中雖然也包括了整型、字符型和浮點型等基本類型,也有基本的組合數據類型數組。可是這些類型都是針對某一種特定類型時應用沒有問題,可是類型自己嚴格限定了數據的存儲特徵、取值範圍、可以進行的操做等方面。可是在面對複雜多變的世界時,有些數據只用基本數據表示,使用將邊的異常複雜;甚至有的時候只是藉助基本類型都沒法表示有些數據,所以數據的多樣性就很是有必要了。多樣的主要途徑就是數據類型定製,C語言中數據定製的基礎包括:指針、結構體、位段、聯合體、枚舉和關鍵字typedef,經過將這些東東進行簡單的組合實現數據的類型定義。數組
1、結構體概念和幹年:函數
一、主要針對須要較多種類的數據才能表示的數據,採用結構體表示會很是方便,例如須要表示在校生的學號、姓名、年齡、性別、成績、其餘等信息時數據類型規劃以下:spa
學號 long指針
姓名 char[]code
年齡 intblog
性別 boolj內存
成績 float編譯器
很明顯看出,不管是採用那種基本的數據類型都沒法完整的表示學生的信息。採用自定義數據類型就成了惟一的選擇,採用結構體數據類型才能把這些數據有效的組織在一塊兒。編譯
二、結構體的關鍵字:struct,常見的教材中的聲明方式爲結構體關鍵字struct,結構體的標籤stu,結構體的成員聲明long sNo; char sName[30]; int sAge; bool sSex; float sScore;等,能夠包括其餘的自定義類型的數據,全部的成員放置到一對大括號{}中,括號後面必須有「;」代表結構體聲明的結束,在此直接接一個結構體的變量名,這是第一種結構體變量聲明的方法: class
1 struct stu{ 2 long sNo; 3 char sName[30]; 4 int sAge; 5 bool sSex; 6 float sScore; 7 } stu1;
初始化的方法爲:
1 stu1.sNo = 0001; 2 //stu1.sName = "zhangsan"; 3 strcpy(stu1.sName, "zhangsan"); 4 stu1.sAge = 20; 5 stu1.sSex = true; 6 stu1.sScore = 78.5;
輸出方法很簡單:
1 printf("%s's info: sNo--%d\t sAge--%d\t sSex--%d\t sScore--%f\n", stu1.sName, stu1.sNo, stu1.sAge, stu1.sSex, stu1.sScore);
應該沒有任何問題,可是存在一個問題就是,在定義結構體的同時進行結構體變量的定義,另外的結構體變量聲明方法,若想再次定義,必須使用struct stu stu2之類的方式定義
1 struct stu stu2; 2 3 stu2.sNo = 0002; 4 strcpy(stu2.sName, "lisi"); 5 stu2.sAge = 21; 6 stu2.sSex = true; 7 stu2.sScore = 80.8; 8 9 printf("%s's info: sNo--%d\t sAge--%d\t sSex--%d\t sScore--%f\n", stu2.sName, stu2.sNo, stu2.sAge, stu2.sSex, stu2.sScore);
整個的結果是:
1 zhangsan's info: sNo--1 sAge--20 sSex--1 sScore--78.500000 2 lisi's info: sNo--2 sAge--21 sSex--1 sScore--80.800003
說明:一、結構體類型聲明必須有struct關鍵字,後又數據類型名
二、定義體現了用戶使用的自主性,能夠有不一樣的數據組合
三、結構體全部成員,包含類型和名稱,必須包含在大括號中,成員能夠爲基本類型和自定義類型(結構體、枚舉、聯合體、指針、數組等),甚至能夠爲結構體自身,結構體定義能夠嵌套
四、結構體成員內部之間不容許有重名,可是能夠和其餘的結構體成員名稱同樣,結構體成員在結構體的命名空間中
五、結構體的聲明只能告訴編譯器結構體的特徵,以及使用時的數據特徵,必須等結構體變量完成初始化後,纔有內存分配
六、結構體定義通常做爲全劇變量,放置到全部函數的外部,或者放置到實現文件的外部,放置到頭文件中
七、結構體一旦定義以後,能夠和普通類型同樣使用,能夠定義結構體數組,結構體變量,結構體指針,甚至,可讓函數傳遞和返回結構體變量
八、結構體在分配內存時,存在着內存對齊的狀況,最好不要人工計算結構體的內存大小,直接使用sizeof(struct stu)能夠獲取咱們定義的結構體的大小
其實咱們也能夠先定義結構體,在使用struct stu stu2這樣的方法來定義結構體變量。
在定義結構體的同時,聲明結構體的變量時,能夠定義匿名結構體,可是,必須在聲明的同時,聲明結構體的變量。
1 struct { 2 long sNo; 3 char sName[30]; 4 int sAge; 5 bool sSex; 6 float sScore; 7 } stu3; 8 9 stu3.sNo = 0003; 10 strcpy(stu3.sName, "wangwu"); 11 stu3.sAge = 23; 12 stu3.sSex = true; 13 stu3.sScore = 83.10; 14 15 printf("%s's info: sNo--%d\t sAge--%d\t sSex--%d\t sScore--%f\n", stu3.sName, stu3.sNo, stu3.sAge, stu3.sSex, stu3.sScore);
1 zhangsan's info: sNo--1 sAge--20 sSex--1 sScore--78.500000 2 lisi's info: sNo--2 sAge--21 sSex--1 sScore--80.800003 3 wangwu's info: sNo--3 sAge--23 sSex--1 sScore--83.099998
因而可知,實際上,有名和無名結構體使用時同樣的,不同的就是再次定義時,特別有結構體嵌套時,更加明顯。
1 typedef struct _stu{ 2 long sNo; 3 char sName[30]; 4 int sAge; 5 bool sSex; 6 float sScore; 7 } Student; 8 9 Student stu4; 10 11 stu4.sNo = 0004; 12 strcpy(stu4.sName, "zhaoliu"); 13 stu4.sAge = 24; 14 stu4.sSex = true; 15 stu4.sScore = 90.16; 16 17 printf("%s's info: sNo--%d\t sAge--%d\t sSex--%d\t sScore--%f\n", stu4.sName, stu4.sNo, stu4.sAge, stu4.sSex, stu4.sScore);
執行結果:
1 zhangsan's info: sNo--1 sAge--20 sSex--1 sScore--78.500000 2 lisi's info: sNo--2 sAge--21 sSex--1 sScore--80.800003 3 wangwu's info: sNo--3 sAge--23 sSex--1 sScore--83.099998 4 zhaoliu's info: sNo--4 sAge--24 sSex--1 sScore--90.160004
這種定義使用時更加的連貫和流暢。
2、結構體的引用和成員的引用
結構體的應用和普通變量的引用徹底同樣,可是對結構體變量的賦值,其實是對結構體變量的成員變量賦值操做的過程,注意方式方法。
結構體變量成員的引用,須要使用成員訪問符號「.」,方法就是stu4.sName訪問結構頭體變量stu4中的成員變量sName的值,一切so easy!
可是一旦面對結構體指針變量時,就有兩種方法(*ptrStu4).sName訪問結構體指針變量ptrStu4中的成員變量sName的值,也可使用ptrStu4->sName這樣的方法,特別是後者,用的不少,可是不作說明,很是容易搞糊塗的。好了,到此爲止吧。