结构体
一、枚举(enum)
- 用户定义的数据类型
enum 枚举类型名字{名0,名1,...,名n};
-
使用时:
enum 枚举类型 变量名;
-
enum就是int
-
默认从0开始,自动+1,可中断
二、结构
-
结构是一个复合的数据类型,可以有多种数据类型
-
声明
-
在函数内外
- 函数内声明只能在函数内使用
- 函数外声明可被多个函数使用
-
结构成员
- 结构与数组类似
- 用
.
访问结构里的成员:结构变量.结构成员
-
结构运算
- 要访问整个结构,直接用结构变量的名字
- 对于整个结构,可以做赋值、取地址,也可以传递给函数参数
p1 = (struct point){5,10}
(强制类型转换)p1 = p2
-
结构指针
-
与数组不同,结构变量的名字并不是其地址,需要使用&运算符
struct date *pDate = &today
-
三、结构与函数
-
结构作为函数参数
-
整个结构可以作为参数的值传入函数
int numberofday(struct date d)
-
实质:在函数中新建一个结构变量,并复制
-
也可以返回一个结构
-
-
输入结构
-
通过函数来读入结构
-
方案一:传入一个初始结构,并处理,处理结束后将这个结构返回并赋值给一个结构
-
方案二:指针
- 使用->表示指针所指的结构变量中的成员
int main() { struct point y={0,0}; getstruct(&y); } struct point* getstruct(struct point *p) { scanf("%d",&p->x); scanf("%d",&p->y); return *p; }
实例:二维坐标点
#include <stdio.h> struct point{ int x; int y; }; struct point* getstruct(struct point*); void output(struct point); void print(const struct point*); int main() { struct point y = {0,0}; getstruct(&y); output(y); output(*getstruct(&y)); print(getstruct(&y)); getstruct(&y)->y = 0; *getstruct(&y) = (struct point){1,2}; } struct point* getstruct(struct point *p){ scanf("%d",&p->x); scanf("%d",&p->y); return p; } void output(struct point p){ printf("%d",&p.x); printf("%d",&p.y); } void print(const struct point* p){ printf("%d %d",p->x,p->y); }
-
-
三、结构中的结构
-
结构数组
-
c struct date { int year, int month, int day }; struct date dates[]={{2021,11,1},{2021,11,2}};
-
结构中的结构
-
```c struct point{ int x; int y; };
struct rectan{ struct point point1; struct point point2; }; ```
-
如果有变量定义:
struct rectan r,*rp=&r
,则以下四种情况等价:rp.point1.x
rp->point1.x
(rp.point1).x
(rp->point1).x
四、类型定义
- 自定义数据类型(typedef)
typedef 变量名 想要的变量名;
后续可通过自行命名的名字调用
五、联合
- union
- 联合起来使用一个空间
- 同一个时间只能有一个成员有效
- union的大小是其最大的成员
- 初始化
- 对第一个成员初始化