目录
一、结构体的声明
1.1结构体的声明
1.2结构体的特殊声明
1.2.1未定义变量的声明
1.2.2未定义标签的声明
二、结构体的初始化
2.1按照结构体成员顺序初始化
2.2按照指定顺序初始化
三、结构体的自引用
四、结构体的内存对齐
结构体(struct)是 C 语言中一种用户自定义的数据类型,它允许用户将不同类型的数据组合在一起,形成一个新的数据类型。结构体可以包含多个成员变量,每个成员变量可以是不同类型的数据,例如整数、浮点数、字符、数组、指针等。
在 C 语言中,定义结构体的语法如下:
struct 结构体名称
{
成员变量声明;
};
其中,结构体名称是结构体的名称,成员变量声明是结构体中包含的成员变量的声明。成员变量的声明类似于变量的声明,但是需要在变量名前面加上结构体名称和一个点号(.)。
例如,下面是一个简单的结构体定义:
struct student
{
int age;
char name[20];
float marks;
};
在这个例子中,我们定义了一个名为 student
的结构体,它包含三个成员变量:age
(表示学生的年龄)、name
(表示学生的姓名,是一个长度为 20 的字符数组)和 marks
(表示学生的成绩)。
struct my_struct
{
int x;
char y;
float z;
};
上面的代码只声明了结构体的定义,但并没有定义结构体变量。
struct
{
int a;
char b;
float c;
}a[20], *p;
上面的结构体在声明的时候省略掉了结构体标签
#include
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};
int main()
{
//按照结构体成员的顺序初始化
struct Stu s = { "胡桃", 16, "女", "202300160715" };
printf("name: %s\n", s.name);
printf("age : %d\n", s.age);
printf("sex : %s\n", s.sex);
printf("id : %s\n", s.id);
return 0;
}
#include
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};
int main()
{
//按照指定的顺序初始化
struct Stu s2 = { .age = 500, .name = "纳西妲", .id = "202305001027", .sex = "⼥"}
printf("name: %s\n", s2.name);
printf("age : %d\n", s2.age);
printf("sex : %s\n", s2.sex);
printf("id : %s\n", s2.id);
return 0;
}
在 C 语言中,可以使用结构体的自引用来创建一个循环结构。例如,下面是一个简单的例子:
struct node
{
int data;
struct node *next;
};
注: 在结构体的自引用中一定不能使用结构体的特殊声明,否则结构体会重复声明,导致代码错误。
在 C 语言中,结构体的内存对齐是指在内存中为结构体分配空间时,按照一定的规则将结构体的成员变量按照某种方式排列,以使每个成员变量的地址都是对齐的。这样做的目的是为了提高程序的运行效率,减少内存访问的开销。一般来说,编译器会按照以下原则进行内存对齐:
举个例子,假设我们定义了一个如下的结构体:
struct my_struct
{
int x;
char y;
short z;
};
在 x86 平台上,该结构体的内存对齐方式如下:
x
的大小为 4 字节,因此它的地址是 4 字节对齐的。y
的大小为 1 字节,因此它的地址是 1 字节对齐的。z
的大小为 2 字节,因此它的地址必须是对齐结构体大小的最小值,即 8 字节对齐的。因此,在内存中,该结构体的排列方式如下:
因为y是1个字节,z是2个字节在内存对齐中第6个字节被浪费了。