c语言-结构体
结构体
结构的模型:
struct 结构体名 { //[成员列表(member list)/域表(field list)] 类型名1 成员名1; 类型名2 成员名3; }
- Tips: - 许多计算机以4个字节为一个“字”,所以,如果在一个“字”中只存放了一个字节,但是该“字”剩下的3个字节不会被占用,而是跳过他们,去到下一个“字”开始存放。 - 所以这里sizeof(student1)的结果是64,而不是63 - 这种定义方式的好处:将`声明类型`和`定义变量`分离开来,可以随时修改1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 成员可以是其他结构体
### 定义结构体
- 1. 先声明结构体类型,在定义该类型的变量
```c
//声明结构体类型
struct Student
{
int num;
char name[20];
char sex;
int age;
//struct Date birthday;
chat addr[30];
}
struct Student student1,student2;2.在声明类型的同时定义变量
struct Student { int num; char name[20]; char sex; int age; }student1,student2;
1
2
3
4
5
6
7
8
9
10
11
12
- 3.不指定类型名而直接定义结构体类型变量
- ```c
struct
{
int num;
int num;
char sex;
int age;
/* data */
}student1,student2;
Tips:
- 结构体类型与结构体变量:
- 类型:定义结构体时用的,不会分配内存;
- 变量:实例化后的结构体,对其分配对应的空间大小;
- 结构体的成员名可以和程序中的变量名相同
- 结构体类型与结构体变量:
结构体变量的初始化和引用
1 |
|
使用结构体数组
- 定义
1
2
3
4
5
6
7
8
9// 方式1.
struct 结构体名
{ 成员列表} 数组名[数组长度];
//方式2
struct Person{
...
};
struct Person leader[3]; - 赋值
1
2
3struct Person leader[3] = { "li",0,"zhang",0,"sun",0};
struct Person leader[3] = { {"li",0},{"zhang",0},{"sun",0}};
结构体指针
就是指向结构体变量的指针
- 一个结构体变量的起始地址 === 结构体变量的指针
指向结构体变量的指针
3种等价方法:
1
2
3
4
5
6
7
8
9
10
11
12struct Student
{
long num;
};
struct Student stu;
//方法1
stu.num;
//方法2
(*p).num;
//方法3
p->num;
指向结构体数组的指针
可以用指针变量指向结构体数组的元素
p应该指向结构体类型,而不是结构体数组元素中的成员
如果非要,先将成员的地址转换成p的类型
1
p = (struct Student*)stu[0].name;
结构体变量和结构体变量的指针作为函数参数
用指针处理链表
共用体类型
1 |
|
1 |
|
枚举类型
- 类型声明
- 方式1:
- 同时声明和定义[不带枚举类型名]
- enum {sum,mon,tue,wed,thu,fri,sat} workday,weekend;
- 方式2:
- 先声明枚举类型名,再定义枚举变量
- enum Weekday{sum,mon,tue,wed,thu,fri,sat};
- enum Weekday workday,weekend;
- 方式1:
- 枚举类型的枚举元素是常量,不能对其赋值
- 每个枚举元素都代表一个整数,一般默认顺序为:0,1,2,3,4….
- 枚举元素可以用来判断比较,因为每个枚举类型变量的值是整数。
typedef声明新类型名
1 |
|
typedef与#define的区别
- 相似:作用都是用来将一个名字替换成另一个
- 不同:
typedef
is duringcompile
#define
is duringprecomppile
c语言-结构体
https://clint456.github.io/2023/09/22/C语言-2023-09-23-结构体/