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