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. 分别初始化,用两个花括号:
    结构体类型 数组[长度]={{成员1的值,成员2的值,成员3的值}{成员1的值,成员2的值}}
    该代码创建了一个数组,元素类型是结构体,同时创建了两个对应结构体类型的结构体变量,不过没有名字,而是通过数组和下标(其实就是指针)进行调用
  2. 连续初始化, 只用一个花括号:
    结构体 数组[长度]={成员1的值,成员2的值,成员3的值,另一个结构体变量的成员1,另一个结构体变量的成员2}
    //一个一个填充第一个匿名结构体变量中的每个成员, 如果填充满了之后就会自动定义并填充下一个匿名结构体变量

1.2. 习惯应用:

  1. 结构体尽量在函数外定义
    1. typedef stuct{}结构体类型;
  2. 但是用结构类型定义结构体变量,要在函数内定义

2. 通过结构体指针取结构体成员的两种方法

  1. 结构体指针->结构体成员
  2. (*p).成员的键(括号不能省略,因为.的优先度高于*)

3. 运算符格式为:

结构体指针结构体成员

4. 作用:

取结构体指针所指结构体的某个成员

5. 结构体的内存表现

5.1. 特性:

  1. 结构体总体内存的大小大于所有成员的内存大小之和

6. 结构体和成员能进行的运算

6.1. 结构体成员能进行的运算:

  1. 能进行该成员数据类型能进行的所有运算

6.2. 结构体能进行的运算:

  1. 可以作为函数参数
    1. 不推荐使用,占用内存的时间较多
    2. 给函数传结构体的话应该使用结构体数组(即结构体指针,数组就是多个地址的连续组)
  2. 可以作为函数的返回值
  3. 结构体可以作为数组的元素 结构体数组
  4. 可以用同类型的结构体赋值
  5. 可以取地址