目录
1. 结构体
1.1 结构体概述
结构体是一种构造数据类型,使用关键字“struct”来表示。是指一系列相同数据类型或者不同数据类型的数据构成的集合。结构体中的成员变量跟数组中的元素一样,在存储空间中都是连续存储的。
格式:
struct 类型名
{
成员(成员变量)1;
成员(成员变量)2;
成员(成员变量)3;
…
成员(成员变量)n;
};
注:结构体声明语句最后必须加";"号
结构体声明时成员变量不能赋值
//先声明结构体类型,再定义结构体变量
struct std
{
char name[20];
int id;
float score;
};
struct std std1;
struct std a;
//在声明结构体类型的同时,定义结构体变量
struct std
{
char name[20];
int id;
float score;
}std1,a; // std1、a 即为定义的结构体变量
1.2 结构体嵌套
结构体嵌套就是一个结构体类型内嵌套另一个结构体类型
#include <stdio.h>
struct std
{
char name[20];
int id;
float score;
};
struct sss
{
int a;
int id;
struct std c;
};
int main()
{
struct sss as={3,45,{"sdsd",43,52.1}}; //定义结构体变量
}
1.3 结构体数组
结构体数组本质上是数组,数组中的元素类型是结构体类型,
格式:结构体关键字 结构体类型名 数组名[数组长度]
#include <stdio.h>
struct std
{
char name[20];
int id;
float score;
};
int main()
{
struct std buff[3]={{"zhangsan",1,68.2},{"lisi",2,96},{"wanger",3,86}};
printf("%s\n",buff[0].name);
printf("%d\n",buff[1].id);
printf("%.2f\n",buff[2].score);
}
1.4 访问成员变量
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
char name[20];
int id;
float score;
}std;
struct sss
{
int a;
int id;
std c;
};
int main()
{
struct sss as={3,45,{"sdsd",43,52.1}};
printf("%d\n",as.a);
printf("%d\n",as.id);
printf("%s\n",as.c.name);
printf("%.2f\n",as.c.score);
}
1.5 指向结构体的指针
#include <stdio.h>
typedef struct
{
char name[20];
int id;
float score;
}std;
int main()
{
std buff[3]={{"zhangsan",1,68.2},{"lisi",2,96},{"wanger",3,86}};
std as={"lisi",45,52.1};
std *p=NULL;
p=&as;
//指针访问成员变量
printf("%d\n",p->id);
p->id = 5;
printf("%d\n",p->id);
p=buff;
printf("%s %s %s\n",(*p).name,(*(p+1)).name,(p+2)->name);
}
1.6 结构体空间计算
(1)对齐原则---内存按结构体成员的先后顺序排列,当排到该成员时,其前面已开辟的空间 字节数必须是该成员类型所占字节数的整数倍,如果不够则补齐,依次向后类推。
(2)整体空间是占用空间最大的成员类型所占字节数的整数倍。
2. 共用体、枚举
2.1 共用体
共用体是一种特殊的结构体,共用体的成员变量共用一个存储空间,当成员变量赋值时会把 前一次的赋值覆盖掉,空间大小是最大成员变量的整数倍。关键字“union”
#include <stdio.h>
union std
{
int a;
char b;
double c;
char buff[10];
};
2.2 枚举
枚举类型是一组整型变量,关键字“enum”
格式:enum 枚举类型名{枚举变量1,枚举变量2……枚举变量n}
#include <stdio.h>
enum number{a,one,two,there,fore,five};//第一个变量代表0,往后依次+1
int main()
{
int a;
printf("%d\n",one);
printf("%d\n",two);
printf("请输入数字1-5\n");
scanf("%d",&a);
switch(a)
{
case one: printf("one\n");break;
case two: printf("two\n");break;
case there: printf("there\n");break;
case fore: printf("fore\n");break;
case five: printf("five\n");break;
}
}