結構類型與結構變量
- 結構類型的定義
1)邏輯上相互聯繫的一組分量的集合
2)結構中分量可以是不同類型的數據,而數組的元素必須都是同類型
3)結構類型的定義格式:
4)舉例struct 結構類型名{ 成員列表; };
struct date1{ int year; int mounth; int day; }; struct student{ int num; char name[20]; char sex; struct date1 age; char addr[30]; };
- 結構變量的定義
1)在定義了結構類型之後,只是表示聲明瞭一種新的數據類型,還沒有分配內存空間
2)必須要用結構類型定義相應的變量才能使用
3)聲明方式①:先聲明結構類型再定義變量
4)聲明方式②:聲明結構類型的同時定義變量struct student{ int num; char name[20]; char sex; int age; char addr[30]; }; struct student s1,s2; // 定義了兩個結構變量s1和s2
5)聲明方式③:省去結構標籤直接定義變量struct student{ int num; char name[20]; char sex; int age; char addr[30]; }s1,s2;// 定義了兩個結構變量s1和s2
struct { int num; char name[20]; char sex; int age; char addr[30]; }s1,s2;// 定義了兩個結構變量s1和s2
- 結構變量的初始化
1)初始化方式①
2)初始化方式②struct student{ int num; char name[20]; char sex; int age; char addr[30]; }; struct student s1={2020111,"wang_li",'f',23,"No2.Linggong Road"};
3)初始化方式③struct student{ int num; char name[20]; char sex; int age; char addr[30]; }s1={2020111,"wang_li",'f',23,"No2.Linggong Road"};
struct student{ int num; char name[20]; char sex; int age; char addr[30]; }; struct student s1={.name="wang_li",.sex='f',.addr="No2.Linggong Road"};
- 結構變量的引用:用
.
來訪問結構變量的成員
結構變量的使用規則
- 對於整個結構,可以做賦值、取地址的操作,也可以傳遞給函數參數
數組不能這樣子賦值struct point{ int x; int y; }p1,p2; p1 = (struct point){5,10} 等價於 p1.x=5,p1,y=10 p2 = p1,相當於p2.x=p1.x; p2.y=p1.y;
- 不能將一個結構變量作爲整體輸入輸出,只能對各個成員分別操作
- 若成員本身也是個結構類型,只能對最低級的成員進行存取及運算:s1.age.year = 2020
- 結構變量的名字不是其地址,需要用&符號獲取地址
結構數組:數組每個元素都是結構變量
-
定義格式
struct 結構類型名{ 成員列表; }; struct 結構類型名 結構數組名[長度]; 或者 struct 結構類型名{ 成員列表; }結構數組名[長度];
-
結構數組的初始化
struct student{ int num; char name[20]; char sex; int age; }; struct student stu[2] = {{1,"LC",'M',20},{2,"CYP",'F',20}}; 或者 struct 結構類型名{ 成員列表; }stu[2] = {{1,"LC",'M',20},{2,"CYP",'F',20}};
-
結構數組的引用:先用數組的下標,再用結構體的點
-
例子:設有三個候選人,每次輸入一個得票的候選人名字,最後輸出每個人的得票數
#include<stdio.h> #include<string.h> struct person{ char name[20]; int count; }leader[3]={{"LC",0},{"CYP",0},{"WHR",0}}; int main(){ int i; while(0==0){ char name[20]; gets(name); if(name[0]=='0') break; for(i=0;i<3;i++){ if(strcmp(name,leader[i].name)==0){ leader[i].count++; } } } for(i=0;i<3;i++){ printf("%d ",leader[i].count); } return 0; }
結構指針
-
指向結構變量的指針
1)定義格式:struct 結構類型名 *結構指針變量
2)賦值:結構變量的名字不是地址,所以要用&取地址
3)引用引用結構變量的成員有三種方式:x.成員、(*p).成員、p->成員名
4)例子#include<stdio.h> #include<string.h> struct student{ long int number; char name[20]; char sex; }; int main(){ struct student s1,*p; p=&s1; s1.number = 2020; strcpy(s1.name,"LC"); s1.sex = 'M'; printf("No.%ld\nname: %s\nsex: %c",s1.number,s1.name,s1.sex); printf("No.%ld\nname: %s\nsex: %c",(*p).number,(*p).name,(*p).sex); printf("No.%ld\nname: %s\nsex: %c",p->number,p->name,p->sex);
-
指向結構數組的指針
-
結構指針的運算:點和->的運算級和括號的級別相同
結構類型數據在函數間的傳遞
- 結構變量作爲函數參數
1)將結構變量作爲一個整體在函數間傳遞
2)在函數內將會新建一個結構變量,並接受調用者的值
3)函數可以返回一個結構 - 結構指針作爲函數參數
1)向函數傳遞的是結構的首地址
2)傳入傳出的是一個指針的大小,不是整個結構
3)函數返回一個結構指針 - 結構數組作爲函數參數
1)向函數傳遞的是結構數組的首地址
2)形參可以是結構數組,也可以是結構指針
共用體
- 定義格式
union 共用體類型名{ 共用體成員表; }
- 共用體與結構體的異同
1)相同:聲明、變量定義、引用方式和結構體類型
2)不同:
結構體使用的是字節對齊的方法
共用體變量所佔內存長度等於最長成員的長度 - 共用體變量的存儲
所有成員共享一個空間,同一時間只有一個成員是有效的