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

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

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

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,写错是会出问题的);其次就是位段储存数不知是从右往左还是从左往右;舍弃问题也是如此,当我们对位段的数取地址,由于它们是分配储存不一,故无法找到正确的地址。

相关文章
|
12月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
12月前
|
存储 人工智能 Serverless
阿里云《AI 剧本生成与动画创作》技术解决方案测评
本问是对《AI 剧本生成与动画创作》的用心体验。结论不是特别理想,在实际使用中仍存在一些问题。
582 22
|
12月前
|
算法
基于排队理论的客户结账等待时间MATLAB模拟仿真
本程序基于排队理论,使用MATLAB2022A模拟客户结账等待时间,分析平均队长、等待时长、不能结账概率、损失顾客数等关键指标。核心算法采用泊松分布和指数分布模型,研究顾客到达和服务过程对系统性能的影响,适用于银行、超市等多个领域。通过仿真,优化服务效率,减少顾客等待时间。
276 33
|
12月前
|
JavaScript 安全 Java
智慧产科一体化管理平台源码,基于Java,Vue,ElementUI技术开发,二开快捷
智慧产科一体化管理平台覆盖从备孕到产后42天的全流程管理,构建科室协同、医患沟通及智能设备互联平台。通过移动端扫码建卡、自助报道、智能采集数据等手段优化就诊流程,提升孕妇就诊体验,并实现高危孕产妇五色管理和孕妇学校三位一体化管理,全面提升妇幼健康宣教质量。
263 12
|
12月前
|
数据挖掘 BI
|
12月前
|
机器学习/深度学习 人工智能 Serverless
👉「免费满血DeepSeek实战-联网搜索×Prompt秘籍|暨6平台横评」
满血 DeepSeek 免费用!支持联网搜索!创作声明:真人攥写-非AI生成,Written-By-Human-Not-By-AI
6333 11
👉「免费满血DeepSeek实战-联网搜索×Prompt秘籍|暨6平台横评」
|
12月前
|
人工智能 JavaScript 测试技术
通义灵码 2.0 体验报告:AI 赋能智能研发的新范式
通义灵码 2.0 是阿里云基于通义大模型推出的先进开发工具,具备代码智能生成、研发问答、多文件修改和自主执行等核心功能。本文通过亲身体验,展示了其在新功能开发、跨语言编程和单元测试生成等方面的实际效果,并对比了 1.0 版本的改进。结果显示,2.0 版在代码生成完整度、跨语言支持和单元测试自动化上有显著提升,极大提高了开发效率,但仍需进一步优化安全性和个性化风格。推荐指数:⭐⭐⭐⭐⭐。
|
12月前
|
人工智能 JavaScript 测试技术
通义灵码 2.0 体验报告:AI 赋能智能研发的新范式
**通义灵码 2.0 体验报告:AI 赋能智能研发的新范式** 本文详细评测了阿里云推出的通义灵码 2.0,基于通义大模型,提供代码智能生成、研发问答、多文件修改等核心能力。通过亲身体验,探讨其在新功能开发、跨语言编程、单元测试生成等场景的实际效果,并对比1.0版本的改进点。结果显示,2.0版本在代码生成完整性、自动化程度及跨语言支持方面有显著提升,但也存在安全性优化和个性化风格调整的空间。推荐指数:⭐⭐⭐⭐⭐。 (239字)
|
12月前
|
算法 编译器 C++
模拟实现c++中的vector模版
模拟实现c++中的vector模版
|
12月前
|
定位技术 C语言
c语言及数据结构实现简单贪吃蛇小游戏
c语言及数据结构实现简单贪吃蛇小游戏

热门文章

最新文章