10.1 枚举
c语言中的一种用户自定义数据类型,用于定义一组相关的常量
枚举类型的存储大小恒为4,与其中包含多少个枚举元素无关
10.1.1 语法格式
enum 枚举名称
{
枚举元素1,
枚举元素2,
...
枚举元素N
};
10.1.2 枚举常量(枚举元素)
1、枚举元素的值必须在同一枚举中是唯一的
2、枚举元素的值必须是整数类型,通常是int
3、如果没有为枚举元素指定值,编译器会自动为它们分配值,从0开始,依次递增。
4、定义枚举的时候也可以为枚举元素自定义值,需保证唯一性和整型类型。
enum Weekday
{
MONDAY,//0
TUESDAY,//1
WEDNESDAY,//2
THURSDAY,//3
FRIDAY,//4
SATURDAY,//5
SUNDAY//6
};
10.1.3 枚举变量
定义变量时指定的变量的类型是枚举类型,称变量为枚举变量,枚举变量的值必须是枚举类型里其中一个枚举常量
1、语法
(1)第一种:先定义枚举类型,再定义枚举变量
//定义枚举类型
enum DAY
{
MON = 1,
TUE,
WED,
THU,
FRI,
SAT,
SUM
};
//使用定义的枚举类型定义枚举变量
enum DAY day;
(2)第二种:定义枚举类型的同时定义枚举变量
enum Weekday
{
MONDAY,
TUFSDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}day1 , day2 = SUNDAY;
(3)第三种:定义枚举类型的同时定义枚举变量,且省略类型名
enum
{
MONDAY,
TUFSDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}day1 , day2 = SUNDAY;
10.2 结构体
结构体类型的存储大小
需要进行内存对齐:
1、成员对齐:成员的偏移量以 自身大小的整数倍 与 系统对齐长度 其中较小的为准
2、结构体整体对齐:结构体的大小必须是 基准对齐长度 的整数倍
3、系统对齐长度:通过#pragma pack()设置系统对齐长度
4、及准对齐长度:从系统对齐长度 与 结构体中最大成员的长度中取最小的
struct S1 //16
{
char c;
int i;
double d;
};

struct S2 //24 此时系统对齐长度为8
{
char c;
int i;
double d;
char c1;
};

通过#pragma pack()改变系统对齐长度后变为20
#pragma pack(4) // 设置系统对齐长度为4
struct S2 //20
{
char c;
int i;
double d;
char c1;
};

10.2.1 语法格式
struct 结构体名
{
数据类型1 成员名1;
数据类型2 成员名2;
...
数据类型n 成员名n;
};
10.2.2 声明结构体变量
1、方式一:先定义结构体,然后再创建结构体变量
// 定义结构体
struct Student
{
int id; // 学号
int age; // 年龄
char *name; // 姓名
char gender; // 性别
char *address; // 家庭住址
};
// 定义结构体变量
struct Student stu1,stu2;
2、方式二:在定义结构体的同时定义结构体变量
// 定义结构体的同时定义 stu1和 stu2 两个变量
struct Student
{
int id; // 学号
int age; // 年龄
char *name; // 姓名
char gender; // 性别
char *address; // 家庭住址
} stu1, stu2;
3、方式三:在定义时不给出结构体名
// 不给出结构体的名字
struct
{
int id; // 学号
int age; // 年龄
char *name; // 姓名
char gender; // 性别
char *address; // 家庭住址
} stu1, stu2;
10.2.3 成员的获取和赋值
成员(属性)是结构体的一个组成部分,一般是基本数据类型,也可以是数组、指针、枚举、结构体等
结构体使用 ‘.’ 获取单个成员,可以进行赋值和取值
// 声明结构体
struct Student
{
int id; // 学号
int age; // 年龄
char *name; // 姓名
char gender; // 性别
char *address; // 家庭住址
};
// 声明结构体变量
struct Student stu;
// 逐个对成员进行赋值
stu.id = 1001;
stu.age = 19;
stu.name = "Jack Ma";
stu.gender = 'm';
stu.address = "Changping BeiJing";
10.2.4 结构体指针
结构体指针是指向结构体的指针变量,允许间接访问和操作结构体的成员,它提供了一种方便的方式来处理结构体数据
语法格式:声明结构体指针struct 结构体名 *结构体指针变量,结构体指针可以通过“->” 操作符访问结构体的成员。
// 声明结构体
struct Student
{
char *name;
int age;
char gender;
};
// 结构体变量
struct Student s = {"张三", 20, 'M'};
// 通过结构体变量访问成员
printf("name=%s,age=%d,gender=%c \\n", s.name, s.age, s.gender);
// 声明结构体指针
struct Student *ps = &s;
// 结构体指针通过解引用访问成员
printf("name=%s,age=%d,gender=%c\\n", (*ps).name, (*ps).age, (*ps).gender);
// 结构体指针使用->访问成员
printf("name=%s,age=%d,gender=%c\\n", ps->name, ps->age, ps->gender);
如果指针变量p指向一个结构体变量stu,则:
stu.成员名 == (*p).成员名 == p->成员名
10.3 共用体
共用体类型的存储大小等于最长的成员的长度;几个成员共用一个内存区
内部可以包含各种属性,但同一时间只能有一个属性,因为所有属性都保存在同一个内存地址,后面写入的属性会覆盖前面的属性
10.3.1 语法格式
union 共用体类型名称
{
数据类型 成员名1;
数据类型 成员名2;
…
数据类型 成员名n;
};
10.3.2 声明共用体变量
1、方式一:先定义共用体类型,再定义共用体变量
// 声明共用体类型
union data
{
short m;
float x;
char c;
};
// 声明共用体变量
union data a, b;
2、方式二:定义共用体类型的同时定义共用体变量
union data
{
short m;
float x;
char c;
} a, b;
3、方式三:在定义时也可以不给出共用体名
union
{
short m;
float x;
char c;
} a, b;
10.3.3 成员的获取和赋值
同结构体一样,共用体也使用点号.获取单个成员,可以进行赋值和取值。
1、方式1:
union data a;
a.c = 4;
2、方式2:声明共用体变量的同时,给任一成员赋值
union data a = {.c = 4};
3、方式3:声明共用体变量的同时,给首成员赋值
union data a = {8};
注意:方式3不指定成员名,所以只能为第一个成员进行赋值。
10.4 typedef
C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样
1、为某个基本类型起别名
typedef 类型名 别名可以一次性起多个别名
typedef unsigned char Byte; //为类型 unsign char 起别名 Byte
Byte c = 'z';
2、为结构体、共用体起别名
(1)先定义结构体,再起别名
struct Treenode
{
// …
};
typedef struct Treenode Tree;
(2)定义结构体的同时起别名
typedef struct Treenode
{
char *name;
int legs;
int speed;
} Tree;
3、为指针起别名
typedef char *String;//为字符指针起别名为 String
char *str1 = "hello"; // 之前的写法
String str2 = "hello"; // 现在的写法
4、为数组起别名
//给 int[100] 取别名 Num
typedef int Num[100]; // 声明Num为整型数组类型名
Num a; // 相当于 int a[100];
![打卡信奥刷题(3584)用C++实现信奥题 P11523 [THUPC 2025 初赛] 摊位分配-171主机测评](https://www.171host.com/wp-content/uploads/2026/09/20260922020544-6ab1e2783b78e-220x150.png)


