## 什么是结构体 - 结构体和数组一样属于构造类型 - 数组是用于保存一组相同类型数据的, 而结构体是用于保存一组不同类型数组的 - 例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。 - 显然这组数据不能用数组来存放, 为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”。 --- ## 定义结构体类型 - 在使用结构体之前必须先定义结构体类型, 因为C语言不知道你的结构体中需要存储哪些类型数据, 我们必须通过定义结构体类型来告诉C语言, 我们的结构体中需要存储哪些类型的数据 - 格式: ```c struct 结构体名{ 类型名1 成员名1; 类型名2 成员名2; …… 类型名n 成员名n; }; ``` - 示例: ```c struct Student { char *name; // 姓名 int age; // 年龄 float height; // 身高 }; ``` --- ## 定义结构体变量 - 定好好结构体类型之后, 我们就可以利用我们定义的结构体类型来定义结构体变量 - 格式: ```struct 结构体名 结构体变量名;``` ![](https://img-blog.csdnimg.cn/img_convert/a19ef99bede1b3b0d689959881390bd0.png) - 先定义结构体类型,再定义变量 ```c struct Student { char *name; int age; }; struct Student stu; ``` - 定义结构体类型的同时定义变量 ```c struct Student { char *name; int age; } stu; ``` - 匿名结构体定义结构体变量 ```c struct { char *name; int age; } stu; ``` >+ 第三种方法与第二种方法的区别在于,第三种方法中省去了结构体类型名称,而直接给出结构变量,这种结构体最大的问题是结构体类型不能复用 --- ## 结构体成员访问 - 一般对结构体变量的操作是以成员为单位进行的,引用的一般形式为:```结构体变量名.成员名``` ```c struct Student { char *name; int age; }; struct Student stu; // 访问stu的age成员 stu.age = 27; printf("age = %d", stu.age); ``` --- ## 结构体变量的初始化 - 定义的同时按顺序初始化 ```c struct Student { char *name; int age; }; struct Student stu = {“lnj", 27}; ``` - 定义的同时不按顺序初始化 ```c struct Student { char *name; int age; }; struct Student stu = {.age = 35, .name = “lnj"}; ``` - 先定义后逐个初始化 ```c struct Student { char *name; int age; }; struct Student stu; stu.name = "lnj"; stu.age = 35; ``` - 先定义后一次性初始化 ```c struct Student { char *name; int age; }; struct Student stu; stu2 = (struct Student){"lnj", 35}; ``` --- ## 结构体类型作用域 - 结构类型定义在函数内部的作用域与局部变量的作用域是相同的 + 从定义的那一行开始, 直到遇到return或者大括号结束为止 - 结构类型定义在函数外部的作用域与全局变量的作用域是相同的 + 从定义的那一行开始,直到本文件结束为止 ```c //定义一个全局结构体,作用域到文件末尾 struct Person{ int age; char *name; }; int main(int argc, const char * argv[]) { //定义局部结构体名为Person,会屏蔽全局结构体 //局部结构体作用域,从定义开始到“}”块结束 struct Person{ int age; }; // 使用局部结构体类型 struct Person pp; pp.age = 50; pp.name = "zbz"; test(); return 0; } void test() { //使用全局的结构体定义结构体变量p struct Person p = {10,"sb"}; printf("%d,%s\n",p.age,p.name); } ``` ## 最后,如果有任何疑问,请加微信 **leader_fengy** 拉你进学习交流群。 开源不易,码字不易,如果觉得有价值,欢迎分享支持。