1. 结构体类型的声明
所谓的结构体,就是在我们不知道如何去形容一件事物的时候,自己所创造的类型
这里我们用来描述一个学生
struct Stu
{
char name[20];
int age;
char sex[5];
char id[20];
};
当然,结构体的类型是根据你想的来定的
2. 结构体变量的创建和初始化
int main()
{
struct Stu s2 = { .age = 18, .name = "lisi", .id = "20230818002", .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;
}
这里我们是可以对他进行一个初始化的,初始化的话就是 . 加这个结构体它的名称就可以进行初始化
3.结构体的自引用
struct Node
{
int data;
struct Node next;
};
注意,这个写法是错误的
所谓的结构体自引用并不是像递归一样在里面所衔接,不然的话它的大小会是无穷的大,很不合理,那我们就是自引用的时候,引用的是它的这个指针。
4. 结构体内存对⻬
所谓的结构体内存对齐,就是只在我们往电脑中存储的时候,但位置必须得要有以下几个条件
每个编译器都会有他独自的这个对齐的大小,我们的每一个类型与它的大小所对比,那么我们往里储存的时候,必须得要在在它位置的整数倍,比如说int类型,它就必须得4的整数倍才能存储,如果是short类型的话,它只能在2的整数倍,我们中间的空间就直接舍弃,这样的话可以加快它的运行速度
但当我们在存储最后的时候,我们所算出来的必须得要是它最大对齐的整数倍,但是它这个最大对齐数是它类型中的最大的字节数与他所规定的最大的最小值,比如说在VS中,它的这个对齐数是8,但是我们的最大的是int类型,那int类型跟8比,那肯定就是int小,就是取小的就是4,所以说即便是最后只存存到了13的位置,但是我们必须得要取它的整数倍,就是16
5. 结构体传参
struct S
{
int data[1000];
int num;
};
struct S s = { {1,2,3,4}, 1000 };
void print1(struct S s)
{
printf("%d\n", s.num);
}
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
就以上代码而言的话,有print1和print2,但是print1的话,很明显是不如print2更加的有效率
由此可见,我们在传参的时候传他的地址
6. 结构体实现位段
也许你没有听说过位段,但是你一定听说过段位。他这个位段呢,主要是用来人工来分配他的地址
以上就是位段的使用方式,如果说超出了或者未超出,就直接舍弃
struct S
{
char a:3;
char b:4;
char c:5;
char d:4;
};
就是相当于只给他3个比特位,4个比特位,5个比特位和4个比特位