11、結構體與共用體

結構類型與結構變量

  • 結構類型的定義
    1)邏輯上相互聯繫的一組分量的集合
    2)結構中分量可以是不同類型的數據,而數組的元素必須都是同類型
    3)結構類型的定義格式:
    struct 結構類型名{
    	成員列表;
    };
    
    4)舉例
    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)聲明方式①:先聲明結構類型再定義變量
    struct student{
    	int num;
    	char name[20];
    	char sex;
    	int age;
    	char addr[30];
    };
    struct student s1,s2;  // 定義了兩個結構變量s1和s2
    
    4)聲明方式②:聲明結構類型的同時定義變量
    struct student{
    	int num;
    	char name[20];
    	char sex;
    	int age;
    	char addr[30];
    }s1,s2;// 定義了兩個結構變量s1和s2
    
    5)聲明方式③:省去結構標籤直接定義變量
    struct {
    	int num;
    	char name[20];
    	char sex;
    	int age;
    	char addr[30];
    }s1,s2;// 定義了兩個結構變量s1和s2
    
  • 結構變量的初始化
    1)初始化方式①
    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"};
    
    2)初始化方式②
    struct student{
    	int num;
    	char name[20];
    	char sex;
    	int age;
    	char addr[30];
    }s1={2020111,"wang_li",'f',23,"No2.Linggong Road"};
    
    3)初始化方式③
    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)不同:
    結構體使用的是字節對齊的方法
    共用體變量所佔內存長度等於最長成員的長度
  • 共用體變量的存儲
    所有成員共享一個空間,同一時間只有一個成員是有效
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章