C語言基礎(結構體與共用體)
一、結構體
1、結構體的定義
結構體是一種複合的資料類型,裡面可以包含多個單一的資料類型
在結構體變量定義之前往往需要先設計結構體,定義結構體的名稱和成員的資料類型,然後使用結構體說明變量,這時候結構體就成了一種新的資料結構。定義結構體往往用struct來修飾:
struct 結構體名
{
成員項清單
};
結構體名是該結構體獨一無二的名稱,命名規則與變量命名相同。成員項清單是結構體中資料成員的資料類型和名稱,資料成員可以是變量、數組、或者其他結構體等符合資料結構。成員清單的一般形式為:
資料類型 成員名1;
資料類型 成員名2;
資料類型 成員名3;
資料類型 成員名4;
資料類型 成員名5;
...
比如;
struct student //結構體名
{
char name[50]; //姓名
char dept[50]; //專業
long no; //學号
float score[4]; //成績
}; //結構體定義結束一定要加上分号
結構體定義後,并沒有在記憶體中為該結構體劃分存儲空間,他隻是作為一種資料結構存在。隻有在使用結構體類型變量類型聲明變量後,系統才用該結構體配置設定記憶體空間給變量。使用結構體聲明變量的一般形式是;
struct student stu1,stu2; //聲明結構體變量stu1,stu2
結構體變量的聲明還有其他形式,例如直接在定義結構體的同時聲明變量,或者省略結構體名直接定義結構體類型的變量。如:
struct student {
...
}stu1,stu2; //定義結構體同時聲明變量
struct{
...
}strc1,strc2; //省略結構體名直接定義結構體類型的變量
這兩種用法使結構體喪失了通用性,特别是省略結構體名的做法,這樣結構體就不能在源代碼其他部分聲明更多的結構體變量。在編寫大型程式的源碼時,結構體定義部分通常放在頭檔案中,使用時包含該頭檔案即可,這樣一個結構體不需要程式的不同檔案中反複定義。
結構體的記憶體配置設定:

開辟了連續的記憶體空間,但是注意不同類型的資料會 中間多占用記憶體(對齊)。
2、結構體變量的引用
應用結構體變量的資料需要同時給出結構體變量名和資料成員名,引用結構體變量的一般形式是:
結構體變量名.資料變量名
比如上述例子中引用資料成員:
stu1.no = 20090001; //使用"."操作符引用結構體成員
這兩種符号的優先級高于算術運算符,是以結構體變量的成員與普通的變量或數組使用方法完全相同。
3、結構體類型變量的初始化
結構體彙集了不同的資料類型,為結構體類型變量初始化就略顯複雜,需要考慮初始化資料與結構體成員項資料類型的比對。如下例所示:
struct student stu1 = {"Tom","Math",20090001,87.5,70.5,93,91};
//聲明結構體變量并初始化
該語句為結構體變量stu1的成員指派,各成員的值分别為:
stu1.name = "Tom"
stu1.dept = "Math"
stu1.no = 20090001
stu1.score[0] = 87.5
stu1.score[1] = 70.5
stu1.score[2] = 93
stu1.score[3] = 91
這種初始化方法的原理是,結構體的成員在記憶體的連續空間中順序存儲,從結構體的首位址開始依次将相比對的資料類型儲存在對應的記憶體單元中。如果結構體中以另一個結構體作為成員,比如:
struct strc1 //定義結構體strc1
{
int a; //定義整型資料成員
long b; //定義長整型資料成員
}
struct strc2 //定義結構體strc2
{
float a; //定義單精度浮點型資料成員
struct strc1 b; //将結構體strc1作為strc2的成員項
}
struct strc2 x; //定義結構體變量x
那麼結構體變量x中各成員的配置設定仍然是在連續空間中,結構體變量x的成員項b在記憶體空間中的總長度為結構體strc1定義的長度,分布形式如strc1定義的順序,如圖:(後續可能要改)
二、結構體數組
4、結構體數組的定義和使用
當需要使用大量相同的結構體變量時候,可使用結構體定義數組,該數組包含與結構體相同的資料結構所組成的連續存儲空間。如下例所示:
struct student stu_a[50]; //聲明長度為50的結構體數組stu_a
引用結構體數組中的元素的一般形式為:
結構體數組名[n].成員名
[]符号的優先級與.符号相同,适用于自左向右結合性,是以運算時候首先獲得的是結構體數組的元素,然後再獲得該元素的成員。如果該成員是數組,引用該成員數組元素的一般形式為:
結構體數組名[n].成員名[n]
同理,如果該成員是結構體變量,引用形式為:
結構體數組名[n].成員名[n].子成員