###########我嘞个扫刚之结构体#########

简介: ###########我嘞个扫刚之结构体#########

一·结构体介绍与书写:
首先我们来讲结构体就是一类物统称,类似于成绩单,里面记录这姓名年龄分数等;下面我们来展示代码:

struct stu {
int age;
int score;
char name [100];

}s;//这里可以定义结构体变量就不用在下面重新定义了
int main() {
/struct stu s = { 65,100,"zhangsan" };//或者还可以这样填进去/
struct stu s = { .age = 65,.name = "zhangsan",.score=100 };
printf("%d %d %s", s.age, s.score, s.name);
return 0;
}

但是为了节约内存问题,以及它的排布,我们最好选用指针来访问:

//接下来我我们来展示一下用指针访问结构体,可以节约内存的使用

struct stu {
int age;
int score;
char name[100];

};
void full(struct stu p) {
p->age = 65;
p->score = 100;
strcpy(p->name, "zhangsan");
}
void print(struct stu
p) {
printf("%d %d %s", p->age, p->score, p->name);
}
int main() {
struct stu s;
full(&s);
print(&s);
return 0;
}

接下来我们介绍下结构体自引用;我们知道在存储得到连续的数字,一定要找得到它的地址使它联系起来,那么结构体也便是如此;故一个结构体中可以存放一定的数据和地址;下面我们引用一段代码来介绍一下 ;

struct Node
{
int data;
struct Node* next;
};//这里是结构体的自引用:我们在结构体里面放上数据以及一个自己类型的指针可以找到另一个结构体变量;
int main() {
struct Node a = { 1, NULL };//这里我们a不在往下找故令为null;
struct Node b = { 2, &a };//我们在这里会打印出结构体变量a的地址
printf("%d\n", b.data);
printf("%p", b.next);
return 0;
}

在这里我们就简单的实现了结构体的自引用效果;

二·结构体对齐问题:
首先结构体放入储存的时候,有一定规矩,我们来解释:

1.首先默认无论第一个成员是什么类型我们都放在对齐数为0的地方;然后之后的成员我们要根据类型判断字节数然后放在对齐数为它和编译器默认的值的最小值排放,然后后面的依次这样。(这里我们说明一下在vs默认值是8;gcc等为对齐数本身大小。

2.我们最后排放完后,数字节数时,它的对齐数一定要是成员中最大对齐数的整数倍。

3.但是可能也会有结构体嵌套结构体类型,那么这个成员结构体的对齐数是这个被嵌套的结构体所

有成员中对齐数最大的倍数,最终这个外面的结构体的字节数就是他的所有成员对齐数的整数倍(包括被嵌套的结构体里面的成员)。

下面我们来用代码解释一下:

struct S {
char a;
int i;
char t;
}s;
int main() {
printf("%zd", sizeof(s));
}

肯定会疑惑这里为什么是12呢;接下来我们来画图解释一下结构体储存的原理:

接下来我们来介绍一下结构体嵌套自己求法:

struct S {
char a;
int i;
char t;
}s;
struct k {
int m;
struct S s;
char p;
}n;
int main() {
printf("%zd", sizeof(n));
}
这里我们画图解释一下:

那么他会打印出:

三·结构体位段问题:
我们首先介绍一下位段简单概念就是给结构体内的成员分配比特位;然后我们就限制了它在内存中的存储大小;下面我们用代码和图片展示一下

当然它的使用也存在跨平台问题:

如我们int 位段的有无符号是不确定的;最大位段的数也是不同(如16位机器是16,32位机器是32,写错是会出问题的);其次就是位段储存数不知是从右往左还是从左往右;舍弃问题也是如此,当我们对位段的数取地址,由于它们是分配储存不一,故无法找到正确的地址。

相关文章
|
10月前
|
监控 Ubuntu Linux
什么Linux,Linux内核及Linux操作系统
上面只是简单的介绍了一下Linux操作系统的几个核心组件,其实Linux的整体架构要复杂的多。单纯从Linux内核的角度,它要管理CPU、内存、网卡、硬盘和输入输出等设备,因此内核本身分为进程调度,内存管理,虚拟文件系统,网络接口等4个核心子系统。
1042 0
|
并行计算 算法 量子技术
量子计算在金融模型中的应用:未来金融的“黑科技”
量子计算在金融模型中的应用:未来金融的“黑科技”
631 1
|
存储 前端开发 数据处理
ArkTS 常用状态管理:深入理解与实践
在HarmonyOS应用开发中,ArkTS的状态管理机制是构建响应式应用的核心。本文详细介绍了ArkTS中的状态管理,包括@State、@Prop、@Link、@Provide和@Consume等装饰器的使用及其在实际开发中的应用和最佳实践。通过这些装饰器,开发者可以实现组件内状态管理、父子组件单向和双向同步、跨组件层级状态同步等功能,从而提高应用的可维护性、可扩展性和性能。
948 1
|
存储 分布式计算 监控
C# 创建一个分布式文件存储系统需要怎么设计??
C# 创建一个分布式文件存储系统需要怎么设计??
277 0
|
PHP 开发者
Trait 同名|学习笔记
快速学习 Trait 同名,本节课学习 trait 同名问题。如果有不同的 trait 来解决不同的公共代码。解决完之后会引入两个或多个 trait。这时 trait 里面就会出现同名的问题。例如:同名的方法、同名的属性。这时应该怎么办呢?就用到这节课学习的内容。本节课的目标是掌握trait同名的处理逻辑,应该在什么样的情况下选择什么样的处理方式。
 Trait 同名|学习笔记
|
弹性计算 小程序 数据挖掘
从零开始搭建物联网平台(二)环境准备
从零开始搭建物联网平台(二)环境准备
672 0
|
存储 算法
图的广度优先搜索和深度优先搜索(邻接链表表示)
邻接表表示法将图以邻接表(adjacency lists)的形式存储在计算机中。所谓图的邻接表,也就是图的所有节点的邻接表的集合;而对每个节点,它的邻接表就是它的所有出弧。邻接表表示法就是对图的每个节点,用一个单向链表列出从该节点出发的所有弧,链表中每个单元对应于一条出弧。为了记录弧上的权,链表中每个单元除列出弧的另一个端点外,还可以包含弧上的权等作为数据域。图的整个邻接表可以用一个指针数组表示。例如下图所示,邻接表表示为
451 0
图的广度优先搜索和深度优先搜索(邻接链表表示)
|
PHP 索引
**PHP删除数组中特定元素的两种方法array_splice()和unset()
方法一: 复制代码代码如下: 输出:array(4) { [0]=> int(1) [1]=> int(5) [2]=> int(7) [3]=> int(8) }   方法二: 复制代码代码如下: 输出:array(4) { [0]=> int(1) [2]=> int(5) [3]=> int(7) [4]=> int(8) }   总结:可以看到使用array_splice()删除特定值和使用unset删除特定值是有区别的。
955 0
|
9天前
|
缓存 测试技术 API
Qwen 3.7 Plus 与 Max 实测:性价比与多模态能力差异解析(2026)
2026 年 6 月 1 日,阿里悄无声息地发布了 Qwen 3.7 Plus,距 Qwen 3.7 Max 上线刚好 11 天。同样的 1M 上下文,同样的 35 小时自治上限。但价格才是头条:Plus 是 0.40/M输入,Max是 2.50/M——便宜约 6 倍——并且还能看图、看视频。Vision Arena 上 Plus 已经排到 #16。所以这周真正值得讨论的问题不是”要不要为视觉能力买单”,而是”Max 凭什么用 6 倍价格换来 2 个百分点的 benchmark 领先”。

热门文章

最新文章