一、说明
- 在 JavaScript 中有对象的概念,在对象中可以定义不同数据类型的数据。C语言中的结构体就相当于 JavaScript 中的对象,也包含各种属性或方法。
- 在 C 语言中有数组数据,但不同于 JavaScript 的是,C 语言要求数组中所有数据的类型必须一样。但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。
- 在C语言中,可以使结构体来存放一组不同类型的数据。
二、结构体的定义
-
语法
struct 结构体名{ 结构体所包含的变量或数组 };
-
结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员。
-
例:创建一个学生信息的结构体
-
代码
#include <stdio.h> int main() { struct stu { char *name; // 姓名 int age; // 年龄 int num; // 学号 char gropu; // 所在组别 float score; // 平均成绩 }; }
-
stu 为结构体名,它包含了 5 个成员,分别是 name、num、age、group、score。结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化即不能给结构体中成员直接赋值。
-
注意:大括号
}
后面的分号;
不能少,这是一条完整的语句,表示结构体的声明结束,舍去会报错。
-
三、结构体变量
-
在上面代码中定义了 stu 结构体,在结构体后面可以定义使用该结构体的变量,这里可以把 stu 看做一个模板,后方的变量是使用了该模板。
-
语法:
#include <stdio.h> int main() { struct stu { char *name; // 姓名 int age; // 年龄 int num; // 学号 char gropu; // 所在组别 float score; // 平均成绩 } stu1,stu2; }
-
说明
- 在上面代码中,stu1 和 stu2 都使用了 stu 这个模板,在 stu1 和 stu2 内部都存在 name、age、num、gropu、srore 这几个成员,并且可以给这些成员赋值(见下文)。
- 值得注意的是,
}
后面是使用模板的变量,}
与变量之间用空格分隔,多个变量之间用,
分隔。最后一个变量的结尾必须加;
四、成员的获取和赋值
-
结构体和数组类似,也是一组数据的集合,整体使用没有太大的意义。数组使用下标
[ ]
获取单个元素,结构体使用点号.
获取单个成员。 -
语法:
结构体变量名.成员名 = 成员值;
-
代码:
#include <stdio.h> int main() { struct stu { char *name; // 姓名 int age; // 年龄 int num; // 学号 char gropu; // 所在组别 float score; // 平均成绩 } stu1; // 编辑学生1的信息 stu1.name = "张三"; stu1.age = 20; stu1.num = 1001; stu1.gropu = 'A'; stu1.score = 97.32; printf("%s的年龄是%d岁,\n\n学号为%d,\n\n所在组是%c组,\n\n平均成绩为%.2f分!\n\n", stu1.name, stu1.age, stu1.num, stu1.gropu, stu1.score); }
-
运行效果
-
除上面逐条赋值外,还有一种更简单的方法,可以在定义变量时直接赋值。
-
代码
#include <stdio.h> int main() { struct stu { char *name; // 姓名 int age; // 年龄 int num; // 学号 char gropu; // 所在组别 float score; // 平均成绩 } stu1 = {"张三",20,1001,'A',97.32}; printf("%s的年龄是%d岁,\n\n学号为%d,\n\n所在组是%c组,\n\n平均成绩为%.2f分!\n\n", stu1.name, stu1.age, stu1.num, stu1.gropu, stu1.score); }
-
运行效果同上。
-
五、typedf 与 strut 的结合应用
-
说明
-
在上述代码中,我们在定义构造体模板的后面定义了模板变量 stu1,并且给 stu1 赋了值。
-
除了这种方法意外,还有一种稍稍繁琐一点的赋值方式,代码如下。
#include <stdio.h> int main() { struct stu { char *name; // 姓名 int age; // 年龄 int num; // 学号 char gropu; // 所在组别 float score; // 平均成绩 }; struct stu stu1 = {"张三",20,1001,'A',97.32}; printf("%s的年龄是%d岁,\n\n学号为%d,\n\n所在组是%c组,\n\n平均成绩为%.2f分!\n\n", stu1.name, stu1.age, stu1.num, stu1.gropu, stu1.score); }
-
运行效果同上,这种方法使用 struct 关键字 + 已有的构造体模板(stu) + 构造体变量(stu1)的形式对 stu1 进行赋值并打印。
-
-
使用 typedef 给构造体起别名
-
使用 typedef 给构造体起别名的好处在于后期的定义构造体变量时更加便捷。
-
代码:
#include <stdio.h> int main() { typedef struct { char *name; // 姓名 int age; // 年龄 int num; // 学号 char gropu; // 所在组别 float score; // 平均成绩 } stu; stu stu1 = {"张三",20,1001,'A',97.32}; printf("%s的年龄是%d岁,\n\n学号为%d,\n\n所在组是%c组,\n\n平均成绩为%.2f分!\n\n", stu1.name, stu1.age, stu1.num, stu1.gropu, stu1.score); }
-
运行效果同上。
-