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)不同:
    结构体使用的是字节对齐的方法
    共用体变量所占内存长度等于最长成员的长度
  • 共用体变量的存储
    所有成员共享一个空间,同一时间只有一个成员是有效
    在这里插入图片描述
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值