day15
结构体存储方式
* 找模 摸是结固体中 字节数最大的
- 模对齐 模的存储空间不够使重新开辟一块模
- 内存对齐 每个成员变量存储的时候都要是后退成员的整数倍
结构体数组
- 结构体数组的声明
- struct 结构体名字 数组名[数组长度]
- struct Student stu[5];
- 结构体数组的初始化(赋值)
struct Student stu[] =
{
{"小明",18},
{"小李",18},
{},
};
* 动态初始化: 限定一后初始化
```
struct Student stu;
stu[0] = {};
stu[1] = {};
```
* 结构体数组的长度计算:(长度: 数组中元素的个数)
sizeof(数组名)/ sizeof(元素的数据类型);
sizeof(students)/sizeof(struct Student);
结构体指针
- 申明格式
- xxx aa;
- xxx *p_aa = &aa;
- struct 结构体名字 变量名;
- struct 结构体名字 *p_aaa = &变量名;
- 怎么给结构体指针赋值
- struct 结构体名字 *p_aa;
- p_aa = &结构体变量名;
- 结构体指针怎么使用
struct Student
{
char *name;
int age;
}
struct Student xiaoMing;
struct Student *p_xiaoMing = &xiaoMing;
- 如何通过结构体指针 给结构体变量赋值
1>
(*p_xiaoming).name = "小明";
(*p_xiaoming).age = 18;
2>指针可以直接访问成员变量
p_xiaoming->name = "小红";
p_xiaoming->age = 18;
注意: 数组名是一个地址,首元素的地址
函数名是一个地址,函数早内存中的首地址
结构体变量名 ,不是一个地址 ,要获取结构体变量的地址要用 &
- 结构体与函数
- 结构体作为函数的参数
- 结构体作为参数传值是值传递
- 如果想函数内部改变结构体变量的值 就用指针
- 结构体作为函数的返回值
- 在返回的时候 直接将这个结构体变量的值返回即可
- 如果想要返回地址 那么就要把这个结构体变量创建在堆区里
*
枚举
- 什么时候定义枚举
- 如何创建一个枚举类型
enum 枚举名字
{
情况1,
情况2,
。。。
};
- 声明枚举类型变量
enum Sex{
kMan,
kFemale,
kYao
};
enum Sex s1;
```
* 枚举变量的初始化
enum Sex s2 = kMan;
* 枚举的作用域
* 全局枚举
* 局部枚举
* 一般都会写全局枚举
* 每个枚举值 枚举项 都有一个对应的整型数据
* **typedef 类型定义**
* .格式:
* typedef 原有的数据类型 别名;
* 什么时候用?
* 一般不用,下节课的情形下使用,或者心真的累的时候用
- 使用typedef为结构体类型取别名.(常用)
1>先声明,后起别名
struct Student
{
char *name;
int age;
int score;
};
typedef struct Student Student;
2>声明的同时起别名
typedef struct _Student
{
char *name;
int age;
int score;
}Student;
3>匿名结构体起别名
typedef struct
{
char *name;
int age;
int score;
}Student;
2,使用typedef为枚举类型取1个短别名
1>先声明,后起别名
enum Direction
{
DirectionEast,
DirectionSouth,
DirectionWest,
DirectionNorth
};
typedef enum Direction Direction;
2>声明的同时起别名
typedef enum _Direction
{
DirectionEast,
DirectionSouth,
DirectionWest,
DirectionNorth
}Direction;
3>匿名枚举起别名
typedef enum
{
DirectionEast,
DirectionSouth,
DirectionWest,
DirectionNorth
}Direction;
```
typedef struct
{
char *name;
int age;
int score;
}Student;
typedef enum
{
DirectionEast,
DirectionSouth,
DirectionWest,
DirectionNorth
}Direction;