资源描述:
《vc++中结构体变量struct的设计》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、前面的教程中我们讲解了数组(Array),它是一组具有相同类型的数据的集合。但在实际的编程过程屮,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为:struct结构体名{结构体所包含的变量或数组};结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。请看下
2、面的一个例子:9■1struetstu{2char*name;//姓名3intnum;//学号4intage;〃年龄5chargroup;//所在学习小组floatscore;//成绩6};7stu为结构体名,它包含了5个成员,分别是name、num^age^group>score。结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化。注总大括号后面的分号;不能少,这是一条完整的语句。结构体也是一种数据类型,它rti程序员口己定义,可以包含多个其他类型的数据。像int、float,char等是由C语言木身提供的数据类型,不能再进行分拆
3、,我们称Z为基本数据类型;而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型。结构体变量既然结构体是一种数据类型,那么就可以用它来定义变量。例如:structstustul,stu2;定义了两个变量stul和stu2,它们都是stu类型,都由5个成员组成。注意关键字struct不能少。stu就像一个“模板”,定义出来的变量都具有相同的性质。也可以将结构体比作“图纸”,将结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的。你也可以在定义结构体的同时定义结构体变量:将变量放在结构体定
4、义的最后即可。9■1structstu{2char*name;//姓名3intnum;//学号4intage;〃年龄5chargroup;//所在学习小组floatscore;//成绩6}stul,stu2;7如杲只需要stul.stu2两个变量,后面不需要再使用结构体名定义其他变量,那么在定义时也可以不给出结构体名,如下所示:91234567struct{//没有写stuchar*name;//姓名intnum;〃学号intage;//年龄chargroup;//所在学习小组floatscore;//成绩}stul,stu2;这样做书写简单,
5、但是因为没有结构体名,后面就没法用该结构体定义新的变暈。理论上讲结构体的各个成员在内存中是连续存储的,和数组非常类似,例如上面的结构体变量stul、stu2的内存分布如下图所示,共占用4+4+4+1+4二17个字节。namenumagegroupscore但是在编译器的具体实现中,各个成员之间可能会存在缝隙,对于stubstu2,成员变量group和score之间就存在3个字节的空白填充(见I、■图)。这样算来,stul、stu2其实占用了17+3二20个字节。namenumagegroupscore关于成员变量之间存在“裂缝”的原因,我们将在
6、《C语言和内存》专题中的《C语言内存对齐,提高寻址效率》一节中详细讲解。成员的获取和赋值12340678910111213141516结构体和数组类似,也是一组数据的集合,整体使用没有太大的意义。数组使用下标[]获取单个元素,结构体使用点号•获取单个成员。获取结构体成员的一般格式为:结构体变量名•成员名;通过这种方式可以获取成员的值,也可以给成员赋值:#includeintmain(){struct{char*name;//姓名intnum;//学号intage;〃年龄chargroup;//所在小组floatscore;//
7、成绩}stul;〃给结构体成员赋值stubname="Toni”;stul・num=12;stu1・age=18;stu1.group二'A';stu1・score=136・5;//读取结构体成员的值printf(z,%s的学号是%(1,年龄是%d,在紅组,今年的成绩是%.If!〃,stu1・name,stu1・num,stu1.age,stu1.group,stu1.score);return0;1819运行结果:Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!除了可以对成员进行逐一赋值,也可以在定义时整体赋值,例如:9■
8、1struct{2char*name;//姓名3intnum;〃学号4intage;//年龄chargroup;//所在小组5floatscore;/