C语言布局体(Struct)亚博充值

前面的教程中我们讲解了数组(Array),它是一组具有不异类型的数据的调集。但在实际的编程过程中,我们往往还需要一组类型差此外数据,例如对付学生信息登记表,姓名为字符串,学号为整数,春秋为整数,地址的学习小组为字符,成效为小数,因为数据类型差别,显然不能用一个数组来存放。

在C语言中,可以使用布局体(Struct)来存放一组差别类型的数据。布局体的界说形式为:

struct 布局体名{
    布局体所包罗的变量或数组
};

布局体是一种调集,它里面包罗了多个变量或数组,它们的类型可以不异,也可以差别,每个这样的变量或数组都称为布局体的成员(Member)。请看下面的一个例子:
struct stu{ char *name; //姓名 int num; //学号 int age; //春秋 char group; //地址学习小组 float score; //成效 }; stu 为布局体名,它包罗了 5 个成员,分袂是 name、num、age、group、score。布局体成员的界说方法与变量和数组的界说方法不异,只是不能初始化。 留意大括号后面的分号;不能少,这是一条完整的语句。 布局体也是一种数据类型,亚博平台,它由措施员本身界说,可以包罗多个其他类型的数据。

像 int、float、char 等是由C语言自己提供的数据类型,不能再进行分拆,我们称之为基本数据类型;而布局体可以包罗多个基本类型的数据,也可以包罗其他的布局体,我们将它称为庞大数据类型组织数据类型
布局体变量 既然布局体是一种数据类型,那么就可以用它来界说变量。例如: struct stu stu1, stu2; 界说了两个变量 stu1 和 stu2,它们都是 stu 类型,都由 5 个成员构成。留意要害字struct不能少。

stu 就像一个“模板”,界说出来的变量都具有不异的性质。也可以将布局体比作“图纸”,将布局体变量比作“零件”,按照同一张图纸出产出来的零件的特性都是一样的。

你也可以在界说布局体的同时界说布局体变量: struct stu{ char *name; //姓名 int num; //学号 int age; //春秋 char group; //地址学习小组 float score; //成效 } stu1, stu2; 将变量放在布局体界说的末了即可。

假如只需要 stu1、stu2 两个变量,后面不需要再使用布局体名界说其他变量,那么在界说时也可以不给出布局体名,如下所示: struct{ //没有写 stu char *name; //姓名 int num; //学号 int age; //春秋 char group; //地址学习小组 float score; //成效 } stu1, stu2; 这样做书写简朴,但是因为没有布局体名,后面就没法用该布局体界说新的变量。

理论上讲布局体的各个成员在内存中是持续存储的,亚博平台,和数组非常类似,例如上面的布局体变量 stu1、stu2 的内存漫衍如下图所示,共占用 4+4+4+1+4 = 17 个字节。


但是在编译器的详细实现中,各个成员之间可能会存在漏洞,对付 stu1、stu2,成员变量 group 和 score 之间就存在 3 个字节的空白填充(见下图)。这样算来,stu1、stu2 其实占用了 17 + 3 = 20 个字节。

关于成员变量之间存在“裂缝”的原因,我们将在《C语言和内存》专题中的《C语言内存对齐,提高寻址效率》一节中具体讲解。 成员的获取和赋值 布局体和数组类似,也是一组数据的调集,整体使用没有太大的意义。数组使用下标[ ]获取单个元素,布局体使用点号.获取单个成员。获取布局体成员的一般格局为:

布局体变量名.成员名;

通过这种方法可以获取成员的值,也可以给成员赋值: #include <stdio.h> int main(){ struct{ char *name; //姓名 int num; //学号 int age; //春秋 char group; //地址小组 float score; //成效 } stu1; //给布局体成员赋值 stu1.name = "Tom"; stu1.num = 12; stu1.age = 18; stu1.group = 'A'; stu1.score = 136.5; //读取布局体成员的值 printf("%s的学号是%d,春秋是%d,亚博最新网址,在%c组,本年的成效是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score); return 0; } 运行成果:
Tom的学号是12,春秋是18,在A组,本年的成效是136.5!

除了可以对成员进行逐一赋值,也可以在界说时整体赋值,例如: struct{ char *name; //姓名 int num; //学号 int age; //春秋 char group; //地址小组 float score; //成效 } stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 }; 不过整体赋值仅限于界说布局体变量的时候,在使用过程中只能对成员逐一赋值,这和数组的赋值非常类似。

需要留意的是,布局体是一种自界说的数据类型,是创建变量的模板,不占用内存空间;布局体变量才包罗了实实在在的数据,需要内存空间来存储。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.3158th.com/a/ganhuo/54.html