1. struct用法:
1.1. 语法:
1.1.1. 创建结构体类型
1.1.1.1. 直接使用struct定义结构体类型(不常用)
struct 结构体类型{ //其中结构体类型可以省略. 结构体类型放在前面,与typedef关键字定义的方法不同
结构体所包含的变量或数组
}结构体变量1, 结构体变量2; 1.1.1.1.1. 直接用struct关键字创建的结构体类型创建结构体变量
struct 结构体类型 结构体变量 //用typedef定义的结构体类型就不用struct关键字1.1.1.1.2. 实例如:
struct{ //忽略结构体类型
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 };//像数组一样可以对整体进行赋值
//给结构体成员赋值,也可以获取.
stu1.name = "Tom";
stu1.num = 12;
stu1.age = 18;
stu1.group = 'A';
stu1.score = 136.5; 1.1.1.2. 用typedef关键字定义结构体类型(非常常用):
1.1.1.2.1. typedef的详解:
child::C语言typedef详解
1.1.1.2.2. 语法:
typedef struct 临时结构体类型{
int 键 = 值; //在结构体内只能使用临时结构体类型, 而不能使用后面定义的结构体类型
}结构体类型,*结构体指针类型 //结构体类型放在后面, 与直接使用struct不同1.1.1.2.3. 用typedef关键字定义的结构体类型来创建结构体变量
结构体类型 结构体变量 //不用struct关键字1.1.2. 定义结构体数组且给结构体数组初始化的语法(重要,常用!):
- 分别初始化,用两个花括号:
该代码创建了一个数组,元素类型是结构体,同时创建了两个对应结构体类型的结构体变量,不过没有名字,而是通过数组和下标(其实就是指针)进行调用结构体类型 数组[长度]={{成员1的值,成员2的值,成员3的值}{成员1的值,成员2的值}} - 连续初始化, 只用一个花括号:
结构体 数组[长度]={成员1的值,成员2的值,成员3的值,另一个结构体变量的成员1,另一个结构体变量的成员2} //一个一个填充第一个匿名结构体变量中的每个成员, 如果填充满了之后就会自动定义并填充下一个匿名结构体变量
1.2. 习惯应用:
- 结构体尽量在函数外定义
- 用
typedef stuct{}结构体类型;
- 用
- 但是用结构类型定义结构体变量,要在函数内定义
2. 通过结构体指针取结构体成员的两种方法
结构体指针->结构体成员(*p).成员的键(括号不能省略,因为.的优先度高于*)
3. →运算符格式为:
结构体指针→结构体成员
4. →作用:
取结构体指针所指结构体的某个成员
5. 结构体的内存表现
5.1. 特性:
- 结构体总体内存的大小大于所有成员的内存大小之和
6. 结构体和成员能进行的运算
6.1. 结构体成员能进行的运算:
- 能进行该成员数据类型能进行的所有运算
6.2. 结构体能进行的运算:
- 可以作为函数参数
- 不推荐使用,占用内存的时间较多
- 给函数传结构体的话应该使用结构体数组(即结构体指针,数组就是多个地址的连续组)
- 可以作为函数的返回值
- 结构体可以作为数组的元素 结构体数组
- 可以用同类型的结构体赋值
- 可以取地址