嵌入式学习-01C语言day10
1 自定义数据类型
1.1 枚举
1.1.1 什么是枚举
枚举(Enumeration)是C语言中的一种用户自定义数据类型,用于定义一组相关的常量。枚举使我们可以为这些常量分配有意义的名字,从而提高代码的可读性和可维护性。
1.1.2 定义枚举
1)语法格式
枚举使用 enum 关键字来定义,枚举名称和枚举元素名称都是标识符,定义一个枚举就是定义了一种枚举数据类型,语法如下:
enum 枚举名称
{
枚举元素1,
枚举元素2,
...
枚举元素N
};
2)枚举常量
枚举元素也称为枚举成员或枚举常量,具有如下特点:
(1)枚举元素的值必须在同一枚举中是唯一的
(2)枚举元素的值必须是整数类型,通常是int
(3)如果没有为枚举元素指定值,编译器会自动为它们分配值,从0开始,依次递增。
(4)定义枚举的时候也可以为枚举元素自定义值,需保证唯一性和整型类型。
3)代码演示
// 定义枚举类型,表示星期一到星期天,枚举元素的值自动分配,从0到6。
enum Weekday
{
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
};
// 定义枚举类型,表示北京地区一年四季的平均温度。为每个枚举元素都设置值,自己设置的值需要保证唯一性和整型类型
enum Season
{
SPRING = 18,
SUMMER = 30,
AUTUMN = 20,
WINTER = -5
};
1.1.3 枚举变量
1)什么是枚举变量
定义变量时指定类型是我们所定义的枚举类型,该变量称为枚举变量。枚举变量的值应该是枚举类型中的枚举常量中的一个,不能是其他值。
2)定义枚举变量的语法
(1)第一种:先定义枚举类型,再定义枚举变量。
// 定义枚举类型
enum DAY
{
MON = 1,
TUE,
WED,
THU,
FRI,
SAT,
SUN
};
// 使用枚举类型定义枚举变量
enum DAY day;
(2)第二种:定义枚举类型的同时声明枚举变量。
enum DAY
{
MON = 1,
TUE,
WED,
THU,
FRI,
SAT,
SUN
} day;
(3)第三种:定义枚举类型的同时声明枚举变量,且省略枚举名称。
enum
{
MON = 1,
TUE,
WED,
THU,
FRI,
SAT,
SUN
} day;
1.1.4 枚举的应用
1)枚举遍历
如果枚举常量的值是连续的,我们可以使用循环遍历;如果枚举常量的值不是连续的,则无法遍历。
#include <stdio.h>
int main()
{
// 定义枚举类型同时定义枚举变量
enum Weekday
{
MONDAY = 1,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
} day;
// 使用循环遍历出所有的枚举常量
for (day = MONDAY; day <= SUNDAY; day++)
{
printf("%d \n", day);
}
// 如果枚举常量的值并不是连续的数字,则无法遍历
// 定义枚举类型同时定义枚举变量
enum Season
{
SPRING = 18,
SUMMER = 30,
AUTUMN = 20,
WINTER = -5
} season;
for (season = SPRING; season <= WINTER; season++)
{
printf("%d \n", season);
}
return 0;
}
输出结果:
1
2
3
4
5
6
7
2)在switch中使用
枚举可以与switch结合使用,请看如下案例:
#include <stdio.h>
int main()
{
// 定义枚举类型
enum SEASONS
{
SPRING = 1,
SUMMER,
AUTUMN,
WINTER
};
// 定义枚举变量
enum SEASONS season;
// 获取用户输入
printf("请输入你喜欢的季节: (1. spring, 2. summer, 3. autumn 4 winter): ");
scanf("%d", &season);
// 判断
switch (season)
{
case SPRING:
printf("你喜欢的季节是春天");
break;
case SUMMER:
printf("你喜欢的季节是夏天");
break;
case AUTUMN:
printf("你喜欢的季节是秋天");
break;
case WINTER:
printf("你喜欢的季节是冬天");
break;
default:
printf("你没有选择你喜欢的季节");
}
return 0;
}
1.2 结构体
1.2.1 什么是结构体
C语言提供了struct关键字,允许自定义复合数据类型,将不同类型的值组合在一起,这种类型称为结构体(structure)类型。
C语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能。
1.2.2 声明结构体
1)格式
构建一个结构体类型的一般形式为:
struct 结构体名
{
数据类型1 成员名1;
数据类型2 成员名2;
……
数据类型n 成员名n;
};
1.2.2 声明结构体变量
1)方式1 先定义结构体,然后再创建结构体变量
// 定义结构体
struct Student
{
int id; // 学号
int age; // 年龄
char *name; // 姓名
char gender; // 性别
char *address; // 家庭住址
};
// 定义结构体变量
struct Student stu1,stu2;
2)方式2 在定义结构体的同时定义结构体变量
// 定义结构体的同时定义 stu1和 stu2 两个变量
struct Student
{
int id; // 学号
int age; // 年龄
char *name; // 姓名
char gender; // 性别
char *address; // 家庭住址
} stu1, stu2;
3)方式3 在定义时也可以不给出结构体名
// 不给出结构体的名字
struct
{
int id; // 学号
int age; // 年龄
char *name; // 姓名
char gender; // 性别
char *address; // 家庭住址
} stu1, stu2;
注意:在C语言中,结构体(struct)和结构体变量是两个不同的概念。
(1)结构体是一种自定义的数据类型,像一种模板,定义了数据的格式。
(2)结构体变量是根据结构体类型创建的变量,代表了一个具体的对象,用于存储数据。
1.2.3 成员的获取和赋值
成员是结构体的一个组成部分,一般是基本数据类型、也可以是数组、指针、结构体等。结构体的成员也可以称为属性。
结构体和数组类似,也是一组数据的集合,结构体使用点号 . 获取单个成员,可以进行赋值和取值。
1)案例1:结构体成员逐个赋值
#include <stdio.h>
int main()
{
// 声明结构体
struct Student
{
int id; // 学号
in