上一节中,我们希望不同的数据类型可以聚合在一起组成一个数据类型。这样,使得代码在逻辑上更加清晰。
我们以人员信息来举例,每一个人员信息由下面4个部分组成。
- 姓名
- 性别
- 身高
- 体重
若使用普通的变量来存储的话,数据是分散的。
char name[20];
int gender;
double height;
double weight;
但是,使用struct
关键词,可以聚合这几种数据类型成为一个新的数据类型。
struct{
char name[20];
int gender;
double height;
double weight;
}
使用struct
关键词,可以创造新的类型。
关键词struct
取自structure
,中文翻译为结构。
这种由多个不同的数据类型组成的类型,我们将其称之为结构。
上面这一串结构类型虽然很长,但是,就相当于int
类型一样。
如同在int
后填变量名可以声明一个整型变量。
在结构类型后面填写变量名可以声明一个结构变量。
int n;
struct {
char name[20];
int gender;
double height;
double weight;
}timmy;
timmy
是由该结构声明的变量,它由4个成员组成。
使用成员运算符.
加上字段名
可以访问到结构的各个成员。
timmy.name;
timmy.gender;
timmy.height;
timmy.weight;
// 声明结构变量
struct {
char name[20];
int gender;
double height;
double weight;
}timmy;
// 将Timmy的数据装入结构变量
strcpy(timmy.name, "Timmy");
timmy.gender = 1;
timmy.height = 170.00;
timmy.weight = 60;
// 从结构变量中显示Timmy的数据
printf("%s\n", timmy.name);
printf("%d\n", timmy.gender);
printf("%.2f\n", timmy.height);
printf("%.2f\n", timmy.weight);
1. 结构别名
现在,我们想定义多个人员信息结构变量。
struct {
char name[20];
int gender;
double height;
double weight;
}timmy;
struct {
char name[20];
int gender;
double height;
double weight;
}david;
struct {
char name[20];
int gender;
double height;
double weight;
}jane;
由于这几个结构变量的内部成员都是一致的,能不能只声明一次结构类型,后续继续使用呢?
我们可以给结构类型声明取一个别名。
struct person{
char name[20];
int gender;
double height;
double weight;
}timmy;
struct person david;
struct person jane;
在第一次声明结构变量时,在struct
与{
之间可以填写一个结构别名。若以后再次需要使用这种结构,仅需要使用struct
加别名
即可声明这种结构的变量。
事实上,我们可以将结构类型声明提取到最开头。让所有的结构变量均由别名来声明。相当于我们先造了一个模板,然后,用这个模板生成各个变量。
struct person{
char name[20];
int gender;
double height;
double weight;
};
struct person timmy;
struct person david;
struct person jane;
请注意,如果结构类型声明在一个函数中,那么别名只能在函数内部使用。
void func1()
{
struct person{
char name[20];
int gender;
double height;
double weight;
};
struct person timmy;
}
void func2()
{
// 别名person无法在func2中使用
struct person david;
}
函数func1
声明了一个结构类型,它的别名为person
。并且使用别名声明了一个结构变量timmy
。
函数func2
中,使用别名person
,声明另一个结构变量,但是别名person
无法在函数func2
中使用,因此将编译报错。
如果需要在多个函数中使用结构别名,那么可以把它放到函数外面。
// 结构声明放到函数外
struct person{
char name[20];
int gender;
double height;
double weight;
};
void func1()
{
struct person timmy;
}
void func2()
{
struct person david;
}