结构体作为有效组合数据的一种手段,相比于基本类型的变量(char、short、int、float…),结构体可以将不同类型的数据组合成一个有机地整体。
struct student
{
int num;
char name[20];
char sex;
int age;
}student1, student2;
如上所示地结构体就能直接将一个学生的基本信息包含在其中,定义结构体变量之后在编程使用过程中既方便也使代码一目了然。和结构体相对应的还有另一种构造类型数据——共用体(联合体\union),两者使用很相似,此处不做过多说明。共用体与结构体的最本质区别就是共用体所有成员变量是公用同一块内存单元,其占用空间大小等于最长的成员的长度。而结构体变量所占内存长度是各成员占的内存长度之和。
一、结构体的基本组成
struct 结构体名
{
成员表列;
}变量名表列;
成员表列可以是各种类型的变量,同样可以是结构体成员变量。变量名表列可以是普通变量、数组、指针,比如struct student stu1, *ps, stu[5]。
二、结构体变量
- 在声明类型的同时定义结构体
struct 结构体名
{
成员表列;
}变量名表列;
具体代码如下:
struct student //类型
{
int num;
char name[20];
char sex;
int age;
}student1, student2; //变量
2.直接定义结构类型变量
struct
{
成员表列;
}变量名表列;
具体代码如下:
struct
{
int num;
char name[20];
char sex;
int age;
}student1, student2; //变量
3.先定义结构体,再定义结构类型的变量
struct 结构体名
{
成员表列;
};
struct 结构体名 变量名表列;
具体代码如下:
struct student
{
int num;
char name[20];
char sex;
int age;
}; //变量
struct student student1, student2;
4.基于typedef定义结构体别名的结构体变量,主要的好处就是在定义变量的时候不用再多写一次struct,在编程的过程中我 们也经常看到typedef在结构体中的使用。
typedef struct [结构体名]
{
成员表列;
}结构体别名;
结构体别名 变量名列表;
具体代码如下:
typedef struct [student]
{
int num;
char name[20];
char sex;
int age;
}STU;
STU student1, student;
其中【[student]】代表可以省略不写,但是要区分开STU和student(结构体名)不是同一个含义。
三、结构体变量的初始化
1.struct [student]
{
int num;
char name[20];
char sex;
int age;
}student1 = {1, “liming”, ‘M’, 24};
2.struct student
{
int num;
char name[20];
char sex;
int age;
};
struct student student1 = {1, “liming”, ‘M’, 24};
3.typedef struct [student]
{
int num;
char name[20];
char sex;
int age;
}STU;
STU student1 = {1, “liming”, ‘M’, 24};
结构体变量的初始化和普通变量的初始化并没有什么差异,按照类似的做法,结构体数组的初始化和普通数组的初始化也是相似的。
四、结构体成员变量的使用
结构体成员变量的使用主要注意的就是结构体变量是普通变量还是指针变量,普通变量使用【.】,指针变量使用【->】。如下:
typedef struct [student]
{
int num;
char name[20];
char sex;
int age;
}STU;
//基于typedef结构体别名分别定义了结构体普通变量、结构体指针变量和结构体数组。
STU student1, *pStu, stu[5];
分别引用结构体中age成员变量:
student1.age;
pStu->age;
(*pStu).age;
stu[0].age;
结构体在编程使用中必不可少,不仅方便代码管理,也使得数据之间的关系一目了然。在最初开始编写代码的时候可能不会主观去使用结构体,甚至觉得繁琐不好用,其实代码写得越久,发现结构体这样一个“小工具”及其既强大又好用,稍作梳理也并不复杂,很明朗。