结构体是 C 语言中的一种复合数据类型。它可以在其中存储不同类型的数据,每个数据成员都可以使用不同的数据类型。结构体定义的基本语法为:
struct struct_name { data_type1 member1;
data_type2 member2;
...
};
其中 struct_name 是结构体的名称,data_typeN 是各个成员的数据类型,memberN 是结构体的成员名。结构体定义也可以包含一些成员函数。
结构体成员的访问方法为结构体变量名.成员名,比如以下代码:
struct student { char name[20];
int age;
float score;
};
struct student s;
strcpy(s.name, "Tom");
s.age = 18;
s.score = 95.5;
这里定义了一个名为 student 的结构体,它包含了 name、age 和 score 三个成员。然后定义了一个类型为 student 的变量 s,通过 s.name、s.age 和 s.score 来分别访问它的三个成员。
在定义结构体时,编译器要按照 CPU 设计者的要求对结构体进行对齐和填充。对齐是指将结构体成员的起始地址设置为某个特定值(通常是该成员长度的整数倍),以便于 CPU 读取,而填充是指编译器会在结构体成员之间填充一些无意义的字节,并增加结构体的长度以满足对齐需求。
注意,在不同的编译器及不同架构的 CPU 上,对齐和填充的规则可能会有所不同。因此,我们需要使用 #pragma pack(n) 来显式设置结构体的对齐方式,其中 n 表示以字节为单位的对齐数。
我们可以在结构体中嵌套使用其他结构体,以便于表示更为复杂的数据类型。例如:
struct date { int year;
int month;
int day;
};
struct student {
char name[20];
int age;
float score;
struct date birthday;
};
在这个例子中,我们定义了一个新的结构体 date,用于记录日期信息。然后我们将它作为 student 结构体的成员之一,来表示学生信息及其生日信息。
结构体成员还可以是指向其它结构体的指针,形成链表或树等数据结构。
结构体可以通过结构体变量的初始化来赋初值,语法为:
struct struct_name variable_name = {value1, value2, ...};
其中 valueN 为结构体成员的初始值。
结构体成员也可以在定义后再进行赋值,例如:
struct student s;s.age = 18;
s.score = 95.5;
strcpy(s.name, "Tom");
s.birthday.year = 2003;
s.birthday.month = 9;
s.birthday.day = 20;
这里我们定义了一个名为 s 的类型为 student 的结构体变量,并对其中的成员进行了初始化和赋值。
总之,结构体成员是用来组成结构体数据类型的各个部分,可以是基本数据类型、数组、指针或其他结构体类型。结构体非常适合用于描述复杂的数据结构和数据对象。在使用结构体时,需要注意结构体的对齐、成员的访问、初始化和赋值等问题。