實際問題中,經常需要對一些類型不同但又相互關聯的數據進行處理。這就需要一種新的數據類型,能夠將具有內在聯繫的不同類型的數據組成一個整體,在C語言中,這種數據類型就是結構體。在C語言中,結構體屬於構造數據類型,它由若干成員組成,成員的類型既可以是基本數據類型,也可以是構造數據類型,而且可以互不相同。
struct 結構體類型名{ 類型1 成員名1; 類型2 成員名2; ... 類型n 成員名n;};其中,struct是定義結構體類型的關鍵字;結構體類型名必須是合法的C標識符,與其前面的struct一起共同構成結構體類型名;花括號內的內容是結構體類型所包括的結構體成員,也稱為結構體分量。struct student{ int num; char name[10]; int chinese,math;};2)成員類型可以是除本身所屬結構體類型外的任何已有數據類型3)在同一作用域內,結構體類型名不能與其他變量名或結構體類型名重名4)同一個結構體各成員不能重名,但允許成員名與程序中的變量名,函數名相同5)結構體類型的作用域與普通變量的作用域相同:在函數內定義,則僅在函數內部起作用;在函數外定義,則有全局作用在實際工作中,一個較複雜的實體往往由多個成員構成,每個成員可以是C語言的基本數據類型,也可以是構造類型,當結構成員的數據類型又是結構類型時,就形成了結構類型的嵌套。struct date{ int year,month,day;};
struct student{ int num; char name[10]; struct date birthday; int chinese,math;};注意:定義嵌套結構,必須先定義成員結構,再定義主結構體。C語言規定,變量必須先定義後使用,主函數語句struct student s1,s2;就是結構體變量定義語句,定義了兩個結構體變量s1和s2,其數據類型是struct student。單獨定義是指先定義一個結構體類型,再定義這種結構體類型的變量。struct student{ int num; char name[10]; int chinese,math;};
struct student S1,S2;注意:關鍵字struct和結構名student必須聯合使用,它們合起來表示一個數據類型名struct student{ int num; char name[10]; int chinese,math;}S1,S2;無類型名定義是指在定義結構體變量時省略結構體名稱。struct { int num; char name[10]; int chinese,math;}S1,S2;無類型名方式只定義結構體變量,不定義結構體類型,若需要定義其他結構體變量,必須把定義過程重新寫一遍。結構體變量的初始化是指在定義結構體變量時對其賦初值。struct student S1={101,」Li」,100,90};結構體變量的存儲形式:按結構體類型定義中成員的先後順序排列。所佔內存空間等於咯成員所佔內存空間之和。可以用長度運算符sizeof計算其所佔空間,計算結果以字節為單位。sizeof(struct student)sizeof(S1)1)結構體類型與結構體變量是兩個不同的概念。前者只聲明結構體的組織形式,本身不佔存儲空間,後者是結構體類型的具體實例,在定義結構體變量時,編譯系統為其分配存儲空間。使用結構體變量主要是引用其結構成員,在C語言中,使用成員運算符(.)來引用結構成員。struct nest_student stu1;stu1.num=1001;strcpy(stu1.name,」Li」);scanf(「%d」,&stu1.birthday.year);printf(「name: %s,stu1.name」);在C語言中可以對兩個相同類型的結構體變量進行整體賦值。賦值時,將賦值符右邊結構體變量的每個成員值都賦值給左邊結構體變量中相應的成員。還可用結構體作為函數參數,或者用結構體類型作為函數返回值類型,以便在函數間傳遞複雜數據,屬於值傳遞。如果有許多相同類型的實體,就需要使用結構體數組。結構體數組是結構體類型與數組的結合,它能將多個具有相同類型的實體組織起來。對結構體數組成員的引用是通過使用數組下標與成員運算符(.)相結合的方式來實現。一般通過賦值語句,將同類型的一個結構體數組元素賦值給另一個元素,或賦值同類型的結構體變量。屬於址傳遞,要求形參必須是地址參數,即必須是同類型的結構體數組或結構體指針。當指針指向結構體變量時,稱為結構體指針,當然,指針變量也可以用來指向結構體數組中的元素。struct student s={101,」Li」,100,90};struct student *p;p=&s;結構體指針的值實際上是結構體變量的首地址。有了結構體指針的定義,既可以通過結構體變量s直接訪問結構成員,也可以通過結構體指針變量p間接訪問它所指向的結構體變量s的各個成員。說明:必須加小圓括號(),因為間接訪問運算符*的優先級低於成員運算符.