Skip to content

结构体

C语言中的结构体是一种自定义数据类型,可以用来存储不同类型的数据。它由多个成员变量组成,每个成员变量可以有不同的数据类型,通过结构体的成员访问符.来访问结构体中的元素。

定义

c
struct 结构体名 {
    数据类型1 成员变量名1;
    数据类型2 成员变量名2;
    ...
};

初始化

对于一个已经定义好的结构体,我们需要为其成员变量赋值。有两种方式可以完成结构体的初始化:

c
struct Student {
    char * name;
    int age;
    float score;
};

逐个成员变量进行初始化

c
struct Student stu;
stu.name = "Tom";
stu.age = 18;
stu.score = 90.5;

使用结构体字面量进行初始化

c
struct Student stu = {"Tom", 18, 90.5};

访问

对于一个已经定义好的结构体,我们可以使用点号.来访问它的各个成员变量。 例如,在上面的示例代码中,我们通过 stu.name、stu.age 和 stu.score 来分别访问了该结构体中的各个属性值。

也可以使用指针访问

c
struct Student stu = {"Tom", 18, 90.5};
struct Student * p = &stu;

printf("%s", (*p).name);

printf("%s", p->name);

结构体传参

值传递

c
#include <stdio.h>

struct Student {
    char * name;
    int age;
    float score;
};

void modify(struct Student student){
    student.age = 19;   // 我们对传入的结构体中的年龄进行修改
}

int main() {
    struct Student student = {"小明", 18, 90.5};
    modify(student);
    printf("%d", student.age);  // 还是 18, 值传递,函数内部改变的是局部变量
}

指针传递

c
#include <stdio.h>

struct Student {
    char * name;
    int age;
    float score;
};

void modify(struct Student * student){
    student->age = 19;   // 我们对传入的结构体中的年龄进行修改
}

int main() {
    struct Student student = {"小明", 18, 90.5};
    modify(&student);
    printf("%d", student.age);  // 19
}

结构体大小

结构体的大小可以通过 sizeof 函数来计算,遵循下面的规则:

  • 规则一:结构体中的元素按照定义顺序依次置于内存上,并非紧密排列。从结构体首地址开始依次将元素放入内存时,元素会被放置在其对齐的大小的整数倍地址上;
  • 规则二:如果结构体大小不是所有元素中最大对齐大小的整数倍,则结构体对齐到最大元素对齐大小的整数倍,填充空间放置到结构体末尾;
  • 规则三:基本数据类型对齐大小为其自身大小,结构体数据类型的对齐大小为其元素中最大对齐元素的对齐大小。

比如在 64 为操作系统上,计算下面结构体的大小: 8 + 4(此时地址位是8,满足int大小的整数倍) + 4(此时地址位是12,满足float大小的整数倍) = 16 满足 64 位操作系统的对齐的倍数,因此该结构体大小为 16.

c
struct Student {
    char * name;
    int age;
    float score;
};

又比如定义顺序发生变化时,计算下面的结构体的大小:4 + 4(第二个元素的起始位应该是8才能满足其大小8的整数倍,因此需要填充 4 个) + 8 + 4(此时地址位是16,满足float大小4的整数倍) + 4(此时不填充时整体大小是20,不满足最大元素大小8字节整数倍的要求,因此需补充4个) = 24

c
struct Student {
    int age;
    char * name;
    float score;
}

总结

结构体是 C 语言中非常重要的数据类型之一,它提供了一种灵活的方式来组合不同类型的数据。通过结构体定义和访问,我们可以将多个相关元素包装成一个单独的整体,并进行操作和修改。在实际开发中,结构体常用于描述复杂的数据结构和存储大量相关数据。

Released under the MIT License.