1.结构体介绍:
结构体(struct)是C、C++、C#等编程语言中的一种复合数据类型,它允许您把多个不同类型的数据项组合成一个单独的类型。通过使用结构体,您可以创建一个自定义的数据类型,该类型包含多个字段,每个字段可以存储不同类型的数据。
在C语言中,结构体的定义通常如下:
struct 结构体名 {
数据类型 成员变量名1;
数据类型 成员变量名2;
...
数据类型 成员变量名N;
};
使用场景:通常定义一个变量时,比如人,拥有多个特性,名字,年龄, 性别等.这时我们可以定义一个结构体
eg:
struct person
{
char name[10];//名字
int age;//年龄
char sex;//性别
};
结构体的声明和初始化和使用:
这里我们需要了解两个操作符:结构体引用操作符 .
指向结构体运算符 ->
2.结构体自引用:
定义一个结构体,他的成员里包括和自身成员类型一致的成员
eg:
struct Node
{
int data;
struct Node next;
};
3.结构体的内存对齐原则:
struct Person
{
char name;//1 对齐数1 默认是8 取较小的1
int age;//4 对齐数4 默认是8 取较小的4
char sex;//1 对齐数1 默认是8 取较小的1
}person;
int main()
{
printf("%zd\n", sizeof(person));
return 0;
}
按常规思想此结构体大小应为1+4+1=6个字节
但根据结构体的内存对齐规则实际是12个字节
我们来根据规则计算一下: 1.name的类型是char对齐数是1,占1字节
2.age是int类型,对齐数为4,此时1+4=5字节,但5不是对齐数4的整数倍
所以会多开设3个字节,成为8(4*2)个字节
3.sex是char类型,对齐数是1,8+1=9,但不是最大成员对齐数4的整数倍
所以会多开设3个字节
所以该结构体的大小是1+4+3+1+3=12个字节
但为什么会存在对齐规则,这样做不是会浪费内存空间吗? 大致有两种解释原因:
4.结构体传参:
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);
}
int main()
{
print2(&s); //传地址
return 0;
}
两种方式传参:建议使用方法二利用指针来传参,因为传地址不用建立新的函数栈帧(内存空间)
5.结构体实现位段
结构体的内容大致就这么多,今天分享到这,
如果你有所收获,可以点点关注爱心收藏
你们的支持是我创作的动力!