|
前言
在我们日常写代码时,经常会遇到结构体类型的使用,今天带读者了解结构体类型的使用。
<hr/>一、初始结构体
在了解结构体之前,我们先来了解一下结构体的基础只是,结构体到底是什么? 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 下面举一个例子:
struct tag
{
menber_list; //成员列表
}variable_list; //变量列表例如我们使用结构体描述一台电脑
struct computer
{
int price;//价格
char name[20];//名称
char brand[10];//品牌
}computer; //需要注意的是最后一行的“ ;”不能丢哦,不然编译器会报错提示你。结构成员的类型 结构成员可以是标量数组、指针、甚至可以是其他的结构体。
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
匿名结构体类型
//匿名结构体类型
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20], *p;上面的代码中结构体省略掉了结构体标签,我们在添加一行代码
p=&x;当我们编译时,会发现这样两个错误

所以这样是不可行的。
结构体的自引用
就像函数递归一样,结构体也可以自己引用自己。他们的格式是这样的。
struct Node
{
int data;
struct Node* next;
};结构体变量的定义和初始化
struct stu
{
char name[20];
int age;
};
struct stu s = { &#34;Geralt &#34;,100};结构体内存对齐
各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数 各成员变量在存放的时候根据在结构中出现的顺序依次申请空间 同时按照上面的对齐方式调整位置 空缺的字节自动填充 同时为了确保结构的大小为结构的字节边界数(即该结构中占用最大的空间的类型的字节数)的倍数,所以在为最后一个成员变量申请空间后 还会根据需要自动填充空缺的字节。 简单的说就是:结构体的内存对齐是拿空间来换取时间的结果,提高了效率,浪费少许空间。 规则如下:
- 第一个成员在与结构体变量偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
- 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所 有最大对齐数(含嵌套结构体的对齐数)的整数倍。
VS编译器中默认对齐数是8。
当然了,作为创建VS,Linux的我们是可以在C语言中自定义对齐数的。
我们可以使用#pragma这个预处理指令修改默认对齐数。
Eg:#pragma pack(4) //修改对齐数为4
结构体传参
struct s
{
int data[1000];
int num;
};
struct s s = { {1,2,3,4},100 };
//结构体传参
void print1(struct s s)
{
printf(&#34;%d\n&#34;, s.num);
}
//结构体地址传参
void print2(struct s* ps)
{
printf(&#34;%d\n&#34;, ps->num);
}
int main()
{
print1(s);
print2(&s);
return 0;
和函数传参一样,形参是实参的一份临时拷贝,参数是需要压栈,会有时间和空间上的系统开销,如果传递的过程中结构体过大,就可能会导致系统开销大,导致性能的下降。我们不如直接传过去一份地址,再对它进行解引用操作符。
END |
|