c语⾔中结构体变量的作⽤,C语⾔结构体类型变量的定义和引
⽤
前⾯学习了变量和数组这些简单的数据结构,它们的特点是必须使⽤规定的数据类型。例如数组被定义为整型后,它的所有存储单元都是由整型构成。现实⽣活中某⼀类事物的共同属性可能是由不同的数据类型组成的集合,或者某⼀属性在不同的情况下表现为不同的数据类型。本章将讲解结构体与共⽤体,⽤来设计复合数据结构。
结构体类型变量的 定义 和 引⽤
结构体是⼀种复合数据类型,它由不同数据类型的存储单元组合。例如,学⽣的成绩表上有姓名、专业、学号和没门功课成绩,姓名和专业可以看作是字符串型数据,学号是⽆符号长整型数据,每门功课是单精度浮点型数据,由这些类型复合组成的学⽣成绩单数据类型,就是结构体类型。
结构体类型变量的 定义
在定义结构体类型变量之前,⾸先需要设计结构体,定义结构体的名称和成员的数据类型,然后使⽤结构体说明变量,这时结构体就成为了⼀种新的数据结构。定义结构体使⽤修饰符 struct,它⼀般形式为:
struct 结构体名 {
成员列表
};
结构体名是该结构体独⼀⽆⼆的名称,命名规则与变量命名相同。成员项列表是结构体中数据成员的数据类型和名称。数据成员可以是变量、数组或者其他结构体等复合数据结构。成员项列表的⼀般形式为:
数据类型 成员名1;
数据类型 成员名2;
数据类型 成员名3;
...
如下例所⽰,学⽣成绩单,该结构为 4 个成员,name[] 和 dept[] 是字符型数组,⽤于保存学⽣姓名与专业,no 是长整型变量,⽤于保存学⽣的学号,score[]是单精度浮点型数组,⽤于保存学⽣的成绩。
struct student { // 结构体名
char name[50]; // 姓名
char dept[50]; // 专业
long no; // 学号
float score[4]; // 成绩
}; // 结构体定义结束⼀定要加上分号
结构体定义后,并没有在内存中为该结构体划分存储空间,它只是作为⼀种数据结构存在。只有在使⽤结构类型声明变量后,系统才⽤该结构体分配内存空间给变量。使⽤结构体声明变量的⼀般形式是:
struct 结构体名 结构体变量名
该语句只能在结构体定义后出现。如下例所⽰:
struct student stu1, stu2; // 声明结构体变量 stu1,stu2
结构体变量的声明还有其他形式,例如直接在定义结构体的同时声明变量,或者省略结构体名直接定义结构体类型的变量。如下例所⽰:
struct student { // 结构体名
// ... // 成员列表
c语言struct头文件} stu1, stu2; // 定义结构体的同时声明变量
struct {
// ... // 成员列表
} stu1, stu2; // 省略结构体名直接定义结构体类型的变量
这2种⽤法使结构体丧失了通⽤性,特别是省略结构体名的做法,这样结构体就不能在源代码其他部分声明更多的结构体变量。在编写⼤型程序的源代码时,结构体定义部分通常放在头⽂件中,使⽤时包含该头⽂件,这样⼀个结构体不需要在程序中的不同⽂件中反复定义。
结构体类型变量的 引⽤
应⽤结构体变量的数据需要同时给出结构体变量名和数据成员名。引⽤结构体变量的⼀般形式为:
结构体变量名.数据成员名
它们之间⽤“.”操作符分隔。如下列代码所⽰:
< = 20090001; // 使⽤“.”操作符引⽤结构体成员
这2种符号的优先级⾼于算术运算符和赋值符号,所以结构体变量的成员与普通的变量或数组使⽤⽅法完全相同。
结构体类型变量的 初始化
结构体汇集了不同的数据类型,为结构体类型变量初始化就略显复杂,需要考虑初始化数据与结构体成员项数据类型的匹配。如下例所⽰:
struct student stu1 = {"Tom", "Math", 20090001, 87.5, 70.5, 93, 91}; // 声明结构体变量并初始化
该语句为结构体变量 stu1 的成员赋值,各成员的值分别为:
stu1.name = "Tom" // 引⽤ name 成员并赋值
stu1.dept = "Math" // 引⽤ dept 成员并赋值
< = 20090001 // 引⽤ no 成员并赋值
stu1.score[0] = 87.5 // 引⽤ score 成员,并为该数组的第 1 个元素赋值
stu1.score[1] = 70.5
stu1.score[2] = 93
stu1.score[3] = 91
这种初始化⽅法的原理是,结构体的成员在内存的连续空间中顺序存储,从结构体的⾸地址开始依次
将匹配的数据类型保存在对应的内容单元中。如果结构体中以另⼀个结构体作为成员项,如下例所⽰:
struct strc1 { // 定义结构体 strc1
int a;
long b;
};
struct strc2 { // 定义结构体 strc2
float a;
struct str1 b; // 将结构体 strc1 作为 strc2 的成员项
}
struct strc2 x; // 定义结构体变量x
那么结构体变量 x 中各成员的分配仍然是在连续空间中,结构体变量 x 的成员项 b 在 内存空间中的总长度为结构体 strc1 定义的长度,分布形式如 strc1 定义的顺序,如下图所⽰:
相关⽂章:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论