枚举
- 常量化符号:用符合而不是具体的数字来表示程序中的数字
- 用枚举而不是定义独立的const int变量
- 枚举是用户定义的一种数据类型,他用enum关键字以下语法来定义:
- enum 枚举类型名字{名字0,名字1…名字n};
- 类型是int类型,值是从0开始
const int red = 0;
const int green = 1;
const int bule = 2;
写成枚举形式:
enum COLOR {RED, GREEN, BLUE};
定义
enum COLOR t = RED;//t = 0;
- 声明枚举量的时候可以指定值
enum COLOR {RED = 1, GREEN, BLUE = 5,YELLOW};
RED = 1;
GREEN = 2;
BLUE = 5;
YELLOW = 6;
结构
声明结构的形式
struct point{
int x;
int y;
};
struct point p1,p2;
//p1和p2都是point类型,里面都有x和Y的值
struct{
int x;
int y;
};
struct p1,p2;
//p1和p2都是无名结构,里面都有x和Y
struct point{
int x;
int y;
}p1,p2;
//p1和p2都是point,里面都有x和Y的值
- 第一种和第三种都声明了结构point,第二种没有声明point,只定义了两个变量
初始化
struct data{
int day;
int month;
int year;
};
struct data today = {07,08,2023};
struct data thismonth = {.month = 08, .year = 2023}
结构运算
- 要访问整个结构体可以直接用结构变量的名字
- 对于整个结构体,可以做赋值、取地址、也可以传递给函数参数
p1 = (struct point){5,10}
p1.x = 5;
p1.y = 10;
p1 = p2;
p1.x = p2.x; p1.y = p2.y;
结构指针
- 与数组不同的是,结构变量的名字并不是结构变量的地址,必须用&运算符
struct point p1 = {1,2};
struct point *p2 = &p1;
结构作为函数参数
int max(struct point p1);
- 整个结构可以作为参数的值传给函数
- 这时候是在函数内部新建一个结构变量,并赋值调用者的结构的值
- 也可以返回一个结构
- 这与数组完全不同
结构指针作为参数
struct data{
int day;
int month;
int year;
}myday;
struct data *p = &myday;
(*p).day = 10;
p->day = 10;
用->表示指向结构体中的成员变量
结构数组和结构中的结构
- 结构数组
struct data datas[100];
struct data datas[100] = {
{1,5,2023},{1,10,2023}};
- 结构中的结构
struct point{
int x;
int y;
};
struct date{
struct point p1;
struct point p2;
};
如果有
struct data d1;
那么就有
d1.p1.x、d1.p1.y、d1.p2.x、d1.p2.y
如果有
struct data d,*pd;
pd = &d;
那么就有下面四种形式等价
d.p1.x;
pd->p1.x;
(d.p1).x;
(pd->p1).x;
但是没有pd->p1->x;因为p1不是指针
联合
联合和结构体类似,但作用和大小不同,联合的大小是几个类型中最大的那个值。
union student
{
int n;
int age;
};
union student un;
printf("%d", sizeof(un));//4
union student
{
int n;
int age;
char m;
};
union student un;
un.n= 100;
printf("%d", sizeof(un));//4
printf("%d", un.age);//100
printf("%d", un.m);//100
printf("%c", un.m);//d
联合的作用:一般来说,不同的变量存在不同的内存,但联合中的这三个变量就存在同一段内存,只是在固定的某时刻,这个内存中只有这三个元素的其中一个元素存在,说到底是省了内存空间