C语⾔中的结构体和共⽤体(联合体)
在 C 语⾔中,结构体(struct)是⼀个或多个变量的集合,这些变量可能为不同的类型,为了处理的⽅便⽽将这些变量组织在⼀个名字之下。由于结构体将⼀组相关变量看作⼀个单元⽽不是各⾃独⽴的实体,因此结构体有助于组织复杂的数据,特别是在⼤型的程序中。
共⽤体(union),也称为联合体,是⽤于(在不同时刻)保存不同类型和长度的变量,它提供了⼀种⽅式,以在单块存储区中管理不同类型的数据。
今天,我们来介绍⼀下 C 语⾔中结构体和共⽤体的相关概念和使⽤。
结构体 / struct结构体的定义
声明⼀个结构体类型的⼀般形式为:
struct 结构体名 {
成员列表
};
其中,成员列表中对各成员都应进⾏类型声明,即:
类型名成员名;
例如,我们需要在程序中记录⼀个学⽣(student)的数据,包括学号(num)、姓名(name)、性别(sex)、年龄(age)、成绩(score)、地址(addr)等,如下图所⽰:
如果要表⽰图中的数据结构,但 C 语⾔并没有提供这种现成的数据类型,因此我们需要⽤定义⼀种结构体类型来表⽰。
truct student {
int num;
char name[20];
char sex;
int age;
floatscore;
char addr[30];
};
上述定义了⼀个新的结构体类型 struct student(注意,struct是声明结构体类型时所必须使⽤的关键及,不能省略),它向编译系统声明,这是⼀个“结构体类型”,它包括 num、name、sex、age、score、addr等不同类型的数据项。
应当说,这⾥的 struct student是⼀个类型名,它与系统提供的标准类型(如 int、char、float、double等)具有同样的作⽤,都可以⽤来定义变量的类型。
结构体变量
前⾯只是声明了⼀个结构体类型,它相当于⼀个模型,但其中并⽆具体的数据,编译系统对其也不分
配实际的内存单元。为了能在程序中使⽤结构体类型的数据,我们应当定义结构体类型的变量,并在其中存放具体的数据。主要以下 3中⽅式定义结构体类型变量:
先声明结构体类型,再定义变量名
结构体类型名结构体变量名;
例如上⾯我们已经定义了⼀个结构体类型 struct student,就可以⽤它来声明变量:
struct student student1, student2;
定义了 student1和 student2为 struct student类型的变量,它们具有 struct student类型的结构,后续我们可以对它们进⾏初始化。
在声明类型的同时定义变量例如:
struct student {
int num;
char name[20];
char sex;
int age;
floatscore;
char addr[30];
} student1, student2;
它的作⽤与第⼀种⽅法相同,即定义了两个 struct student类型的变量 student1、student2。这种形式的定义的⼀般形式为:
struct 结构体名 {
成员列表
} 变量名列表;
直接定义结构体类型变量其省略了结构体名,⼀般形式为:
struct {
成员列表
} 变量名列表;
关于结构体类型,需要补充说明⼀点:
类型与变量是不同的概念,不要混淆。我们只能对变量赋值、存取或运算,⽽不能对⼀个类型进⾏赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。
简单地说,我们可以把“结构体类型”和“结构体变量”理解为是⾯向对象语⾔中“类”和“对象”的概念。
此外,结构体⾥的成员也可以是⼀个结构体变量。⽐如我们先声明了⼀个结构体 struct date:
struct date {
int month;
int day;
int year;
};
然后把它应⽤于声明 struct student中:
struct student {
int num;
char name[20];
char sex;
int age;
floatscore;
struct date birthday;
char addr[30];
} student1, student2;
最后,解释⼀个在阅读⼤型开源代码(⽐如 Objective-C Runtime 源码)时容易产⽣疑问的点:如下两个结构体SampleA和 SampleB声明的变量在内存上其实是完全⼀样的,原因是因为结构体本⾝并不带有任何额外的附加信息:struct SampleA {
int a;
int b;
int c;
};
struct SampleB {
int a;
struct Part1 {
int b;
};
struct Part2 {
int c;
};
};
c语言struct头文件结构体变量的引⽤
引⽤结构体变量中成员的⽅式为:
结构体变量名.成员名
例如,student1.num表⽰ student1变量中 num成员,我们可以对结构体变量的成员进⾏赋值:student1.num = 10010;。
如果成员本⾝⼜属于⼀个结构体类型,则要⽤若⼲个成员运算符(点号 .),⼀级⼀级地到最低⼀级的成员,例如:
h = 9;
另外对结构体变量的成员可以像普通变量⼀样进⾏各种运算,也可以⽤取址运算符 & 引⽤结构体变量成员的地址,或者引⽤结构体变量的地址。
结构体变量的初始化
和其他类型变量⼀样,对结构体变量可以在定义时指定其初始值,⽤⼤括号括起来:
struct student {
int num;
char name[20];
char sex;
int age;
char addr[30];
} a = {10010, "Li Lei", 'M', 18, "Beijing Haidian"};
结构体与数组
如果⼀个数组的元素为结构体类型,则称其为“结构体数组”。结构体数组与之前介绍的数值型数组的不同之处在于每个数组元素都是⼀个结构体类型的数据,它们都分别包括各个成员项。
定义结构体数组
和定义结构体变量的⽅法类似,只需声明其为数组即可,例如:
struct student {
int num;
char name[20];
char sex;
int age;
floatscore;
char addr[30];
};
struct student stu[3];
以上定义了⼀个数组 stu,数组有 3 个元素,均为 struct student类型数据,如下图:
结构体数组的初始化
与其他类型的数组⼀样,对结构体数组可以初始化,例如:
struct student {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。