第19讲:自定义类型:结构体

news2024/11/18 2:37:55

1.结构体类型的声明

2.结构体变量的创建和初始化

3.结构体变量的赋值

4.结构体成员访问操作符

5.结构体内存对齐

1.结构体类型的声明

1.1结构体声明

struct 结构体名称

{

        结构体成员...

}

举例:描述一个学生:

2结构体变量的创建和初始化

2.1匿名结构体类型

匿名结构体就是在声明时不给结构体取名字,这样的类型只能在结构体声明时顺便创建变量,在不使用关键字typedef时是不能在其他地方进行结构体变量的定义的。

这里对a的初始化不是必须的, 可以只定义结构体变量a。

2.2匿名结构体搭配typedef

这时候就可以用typedef所创造的别名实现结构体变量的定义了。

2.3结构体的自引用

在结构体中不能包含类型为自己本生的成员

在struct stu类型里放着一个struct stu类型的成员b,那么成员b里面又有一个类型为struct stu的成员变量,如此下去,就像套娃一样,永远走不到尽头。(结构体变量是可以不完全初始化的,这里不是因为未初始化成员变量b所导致的错误)

但是,结构体声明中允许有自身类型所对应的指针类型的成员变量。

那么,这里可以用匿名结构体吗?

答案是不可以的!!!

我们用typedef试试:

这是因为声明的优先级高于typedef,这里的stu是对前面这个结构体声明的取别名。

所以,最好是把名字取好。

3.结构体变量的赋值

使用花括号依次赋值

4.结构体成员访问操作符

方法一:用点号对结构体变量的成员变量进行访问。

方法二:用->通过结构体变量的指针对结构体变量的成员进行访问。

5.结构体内存对齐

5.1对齐规则

1.结构体的第一个成员对齐到结构体变量起始位置偏移量为0的位置

2.其他成员要对齐到对齐数的整数倍的地址处

对齐数=编译器默认对齐数和成员变量中较小的一个

vs的默认对齐数是8

linux中gcc没有默认对齐数,对齐数就是成员自身的大小

3.结构体总大小为最大对齐数(每个成员都有一个对齐数,取当中最大的)的整数倍

4.如果结构体1内嵌套了结构体2,那么结构体2的对齐数是结构体2成员变量中最大的对齐数,结构体1的总大小是所有最大对齐数(包含被嵌套的结构体成员)的整数倍。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct stu
{
	char c1;
	int i;
	char c2;
};
int main()
{
	printf("%zd", sizeof(struct stu));
	return 0;
}

c1的大小是1,默认对齐数是8,所以c1的对齐数是1,现占用1字节

i的大小是4,默认对齐数是8,所以i的对齐数是4,为了对齐,先浪费3个字节,再分配4个字节,现占用8字节

c2的大小是1,默认对齐数是8,所以c1的对齐数是1,已经对齐,不需要浪费空间,分配一个字节,现在占用9字节

最大对齐数为4,为了对齐,需再浪费3个空间,共12字节

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct stu
{
	char c1;
	char c2;
	int i;
	
};
int main()
{
	printf("%zd", sizeof(struct stu));
	return 0;
}

8个字节

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct stu
{
	double d;
	char c;
	int i;
	
};
int main()
{
	printf("%zd", sizeof(struct stu));
	return 0;
}

16个字节

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct stu
{
	double d;
	char c;
	int i;
	
};
struct s
{
	char c1;
	struct stu a;
	double d;
};
int main()
{
	printf("%zd", sizeof(struct s));
	return 0;
}

32个字节

5.2为什么存在内存对齐

1.不是所有硬件都能任意访问任意地址上的任意数据的,某些硬件只能在某些地址处取某些特定类型的数据。

2.对齐后的数据基本只需一次就能完成访问,假设处理器一次取8个字节,则开始取的位置必须是8的整数倍,如果能保证所有的double类型的数据地址都对齐到8的整数倍,那么这样的double类型的数据只需一次就能取出。

总的来说:内存对齐是一种空间换时间的操作

在声明结构体的时候,尽量让小的成员聚在一起,从而使用零碎的空间,在节省时间的前提下,尽量节省空间。

5.3修改默认对齐数

#pragma pack()//括号里写新的默认对齐数

#pragma pack()//括号里什么都不写,恢复默认对齐数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1594698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux文本编辑器vim使用和分析—2

目录 1.对vim的简单理解&#xff1a; 2.看待vim的视角&#xff1a; 3.命令模式&#xff1a; 3.1vim被打开后默认的模式&#xff1a; 3.2命令模式切换插入模式&#xff1a; 3.3其他模式回到命令模式&#xff1a; 3.4光标定位&#xff1a; 4.插入模式(编辑模式)&#xff1…

数字乡村创新实践探索农业现代化与农村治理现代化新路径:科技赋能农村全面振兴与农民幸福生活

目录 引言 一、数字乡村与农业现代化 1、智慧农业技术的应用 2、农业产业链的数字化转型 二、数字乡村与农村治理现代化 1、农村信息化水平的提升 2、农村治理模式的创新 三、科技赋能农村全面振兴与农民幸福生活 1、提升农业生产效益与农民收入 2、促进农村产业结构…

【ArcGIS 脚本工具】在ArcPro中实现mdb转gdb

ArcGIS Pro作为主力使用很久了&#xff0c;但是ArcMap也从来没有卸载过。 要问为什么&#xff0c;就是还需要ArcMap来读写mdb数据库&#xff0c;Pro是不支持读写mdb数据库的。 我之前尝试过不借助ArcMap把mdb转成gdb&#xff0c;奈何技术太菜搞不定。 直到我看到了公众号【G…

人工智能轨道交通行业周刊-第77期(2024.4.1-4.14)

本期关键词&#xff1a;货车巡检机器人、铁路安全技防、车辆换长、阿里千问、大模型创业 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界…

现代电商会员管理新玩法——付费会员

现在&#xff0c;无论是线上还是线下&#xff0c;几乎都在做会员管理。会员规则五花八门&#xff0c;不仅有常见的注册会员&#xff0c;还出现了付费会员。付费会员机制&#xff0c;从成为会员的第一步就开始筛选&#xff0c;选出粘性高、要求高、复购高且有一定消费力的用户群…

缓存与数据库的数据一致性解决方案分析

在现代应用中&#xff0c;缓存技术的使用广泛且至关重要&#xff0c;主要是为了提高数据访问速度和优化系统整体性能。缓存通过在内存或更快速的存储系统中存储经常访问的数据副本&#xff0c;使得数据检索变得迅速&#xff0c;从而避免了每次请求都需要从较慢的主存储&#xf…

labview中的同步定时结构

单帧定时循环定时比较精确&#xff0c;最常用的功能还是它的定时循环功能&#xff0c;定时循环允许不连接“循环条件”端子&#xff0c;可以连接定时循环“结构名称”端子&#xff0c;通过定时结构停止函数停止循环。 例子在附件中。

MySQL workbench使用教程(逐渐补充版)

附件&#xff1a; 附1&#xff1a;MySQL下载、安装、配置之Windows 附2&#xff1a;MySQL workbench下载、安装、配置、汉化教程 一、 使用 Workbench 操作数据库 1.MySQL Workbench 初始化界面 2.连接远程 MySQL 数据库 3.创建数据库 切换至schemas标签&#xff0c;右键单…

在家如何查找下载外文文献

查找下载外文文献的数据库大部分都需要使用权限的&#xff0c;那么我们如何在家进入这些数据库查找下载文献资源呢&#xff1f;请看本文的经验分享&#xff1a; 举例1、 一位同学的文献求助&#xff1a;Performance of financial hedging and earnings management under dive…

科研学习|科研软件——如何使用SmartPLS软件进行结构方程建模

SmartPLS是一种用于结构方程建模&#xff08;SEM&#xff09;的软件&#xff0c;它可以用于定量研究&#xff0c;尤其是在商业和社会科学领域中&#xff0c;如市场研究、管理研究、心理学研究等。 一、准备数据 在使用SmartPLS之前&#xff0c;您需要准备一个符合要求的数据集。…

【自研网关系列】请求服务模块和客户端模块实现

&#x1f308;Yu-Gateway&#xff1a;&#xff1a;基于 Netty 构建的自研 API 网关&#xff0c;采用 Java 原生实现&#xff0c;整合 Nacos 作为注册配置中心。其设计目标是为微服务架构提供高性能、可扩展的统一入口和基础设施&#xff0c;承载请求路由、安全控制、流量治理等…

EasyUI Jquery 学习笔记 ——DataGrid(数据网格)与 Tree(树)详细版

1. DataGrid(数据网格)与 Tree(树) 1.1 Datagrid 数据网格 扩展自 $.fn.panel.defaults。通过 $.fn.datagrid.defaults 重写默认的 defaults。 数据网格(datagrid)以表格格式显示数据,并为选择、排序、分组和编辑数据提供了丰富的支持。数据网格(datagrid)的设计目…

前端三件套学习笔记(持更)

目录 1、HTML,CSS,JS区别 2、HTML结构 1、HTML,CSS,JS区别 结构写到 HTML 文件中&#xff0c; 表现写到 CSS 文件中&#xff0c; 行为写到 JavaScript文件中。 2、HTML结构 <!DOCTYPE html> <html><head><title>我的第一个页面</title><…

[尚硅谷flink] 检查点笔记

在Flink中&#xff0c;有一套完整的容错机制来保证故障后的恢复&#xff0c;其中最重要的就是检查点。 文章目录 11.1 检查点11.1.1 检查点的保存1&#xff09;周期性的触发保存2&#xff09;保存的时间点3&#xff09;保存的具体流程 11.1.2 从检查点恢复状态11.1.3 检查点算法…

计算机服务器中了rmallox勒索病毒怎么办,rmallox勒索病毒解密流程步骤

在企业的生产运营过程中网络发挥着巨大作用&#xff0c;利用网络可以拓宽市场&#xff0c;提高办公效率&#xff0c;网络为企业的生产运营提供了极大便利&#xff0c;但也为企业的数据安全带来隐患。近日&#xff0c;云天数据恢复中心接到多家企业的求助&#xff0c;企业的计算…

二维相位解包理论算法和软件【全文翻译- 菲林(Flynn)最小不连续性方法(4.5)】

4.5 菲林最小不连续性方法 在迄今为止对路径跟踪算法的讨论中,我们忽略了一种非常自然的方法,现在我们将对其进行描述。如果我们仔细观察图 4.42(a)中包裹相位数据中的条纹图案,就会发现 "条纹线 "或最亮像素和最暗像素之间的边界标志着从 0 到 2π 的过渡,它们…

Linux gcc 6

本章开始学习工具 什么是工具&#xff1f; 本质也是指令 yum 命令 小火车 sudo yum install sl&#xff08;安装sl&#xff09; sudo yum install -y sl //直接yes就不提示了 yum list //将yum源上的软件都穷举出来 yum search sl //结果不友好&#xff0c;不推荐 yum lis…

智能革命:未来人工智能创业的天地

智能革命&#xff1a;未来人工智能创业的天地 一、引言 在这个数字化迅速变革的时代&#xff0c;人工智能(AI)已经从一个边缘科学发展成为推动未来经济和社会发展的关键动力。这一技术领域的飞速进步&#xff0c;不仅影响着科技行业的每一个角落&#xff0c;更是为创业者提供了…

PTA 2813:画家问题(熄灯问题)

有一个正方形的墙&#xff0c;由NN个正方形的砖组成&#xff0c;其中一些砖是白色的&#xff0c;另外一些砖是黄色的。Bob是个画家&#xff0c;想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i,j)个位置的砖时&#xff0c; 位置(i−1,j)、 (i1,j)、(i,j−1)、(i…

设计模式学习笔记 - 设计模式与范式 -行为型:17.中介模式:什么时候用中介模式?什么时候用观察者模式?

概述 本章学习 23 种经典设计模式中的最后一个设计模式&#xff0c;中介模式。和之前讲过的命令模式、解释器模式类似&#xff0c;中介模式也不怎么常用&#xff0c;应用场景比较特殊、有限&#xff0c;但是&#xff0c;跟它俩不同的是&#xff0c;中介模式理解起来并不难&…