C語言應用--數據類型定製必定義和引用

  目前,定製正在變的愈來愈廣泛,定製服務、定製衣服、甚至使用的鍵盤都是定製了。在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這樣的方法,特別是後者,用的不少,可是不作說明,很是容易搞糊塗的。好了,到此爲止吧。

相關文章
相關標籤/搜索