一、結構體的定義
數組(Array)是一組具有相同類型的數據的集合。但在實際的編程過程中,我們往往還需要一組類型不同的數據,例如對於學生信息登記表,姓名為字符串,學號為整數,年齡為整數,所在的學習小組為字符,成績為小數,因為數據類型不同,顯然不能用一個數組來存放。
結構體(Struct)可以來存放一組不同類型的數據。其是C語言中聚合數據類型(aggregate data type)的一類。結構體可以被聲明為變量、指針或數組等,用以實現較復雜的數據結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。
結構體的定義形式為:
struct 結構體名{ 結構體所包含的變量或數組 };
例如:
struct stu{ char *name; //姓名 int num; //學號 int age; //年齡 char group; //所在學習小組 };
定義結構體變量:
struct stu stu1,stu2;
或者在定義結構體的同時定義變量:
struct stu{ char *name; //姓名 int num; //學號 int age; //年齡 char group; //所在學習小組 }stu1,stu2;
常用的是利用typedef為struct stu取別名:
typedef struct stu{ char *name; //姓名 int num; //學號 int age; //年齡 char group; //所在學習小組 }student;
student stu1, stu2;
給結構體變量賦值:
stu1.name = "Tom"; stu1.num = 12; stu1.age = 18; stu1.group = 'A'; stu1.score = 136.5;
二、結構體數組的定義
//賦值
struct stu stu1[5]; //或student stu1[5];
//賦值 class[5] = { {"Li ping", 5, 18, 'C', 145.0}, {"Zhang ping", 4, 19, 'A', 130.5}, {"He fang", 1, 18, 'A', 148.5}, {"Cheng ling", 2, 17, 'F', 139.0}, {"Wang ming", 3, 17, 'B', 144.5} }
結構體數組的使用,例如,
獲取 Wang ming 的成績:stu1[4].score;
修改 Li ping 的學習小組:class[0].group = 'B';
三、結構體指針
當一個指針變量指向結構體時,我們就稱它為結構體指針。C語言結構體指針的定義形式一般為:
struct 結構體名 *變量名;
注意,結構體變量名和數組名不同,數組名在表達式中會被轉換為數組指針,而結構體變量名不會,無論在任何表達式中它表示的都是整個集合本身,要想取得結構體變量的地址,必須在前面加&
,所以給 pstu 賦值只能寫作:
struct stu *pstu = &stu1;
獲取結構體成員:.
的優先級高於*
,(*pointer)
兩邊的括號不能少。
(*pointer).memberName
或:->
是一個新的運算符,可以通過結構體指針直接取得結構體成員;
pointer->memberName
結構體指針作為函數參數:
結構體變量名代表的是整個集合本身,作為函數參數時傳遞的整個集合,也就是所有成員,而不是像數組一樣被編譯器轉換成一個指針。如果結構體成員較多,尤其是成員為數組時,傳送的時間和空間開銷會很大,影響程序的運行效率。所以最好的辦法就是使用結構體指針,這時由實參傳向形參的只是一個地址,非常快速。
注意:結構體數組指針的使用(結構體數組變量名前不需要加&)
#include <stdio.h> struct stu{ char *name; //姓名 int num; //學號 int age; //年齡 char group; //所在小組 float score; //成績 }stus[] = { {"Zhou ping", 5, 18, 'C', 145.0}, {"Zhang ping", 4, 19, 'A', 130.5}, {"Liu fang", 1, 18, 'A', 148.5}, {"Cheng ling", 2, 17, 'F', 139.0}, {"Wang ming", 3, 17, 'B', 144.5} }, *ps; int main(){ //求數組長度 int len = sizeof(stus) / sizeof(struct stu); printf("Name\t\tNum\tAge\tGroup\tScore\t\n"); for(ps=stus; ps<stus+len; ps++){ printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score); } return 0; }