结构类型与结构变量
- 结构类型的定义
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)不同:
结构体使用的是字节对齐的方法
共用体变量所占内存长度等于最长成员的长度 - 共用体变量的存储
所有成员共享一个空间,同一时间只有一个成员是有效的