10-2. 结构体

  • 学习人数 30K+
  • 适合所有人群学习
avatar
林耿亮

你好编程主讲老师

上一节中,我们希望不同的数据类型可以聚合在一起组成一个数据类型。这样,使得代码在逻辑上更加清晰。

我们以人员信息来举例,每一个人员信息由下面4个部分组成。

  1. 姓名
  2. 性别
  3. 身高
  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;
}