结构体<C语言>

news2024/11/9 3:46:07

导言

结构体是C语言中的一种自定义类型,它的值(成员变量)可以是多个,且这些值可以为不同类型,这也是和数组的主要区别,下面将介绍它的一些基本用法,包括:结构体的创建、结构体变量的声明、初始化、结构体的访问、结构体的内存对齐等。


目录

导言

结构体的创建

结构体变量的声明

结构体成员的初始化、访问

结构体的内存对齐


结构体的创建

struct stu {//比如描述一个学生
	char name[10];//名字
	int age;//年龄
	int score;// 得分
};

结构体变量的声明

常用的有以下3种:

1.在结构体创建时同时声明结构体变量:

struct stu {//比如描述一个学生
	char name[10];//名字
	int age;//年龄
	int score;// 得分
}stu1,stu2;//声明了stu1和stu2

2.先创建结构体,后声明(包括在函数内部声明):

//2.先创建结构体,后初始化:
struct stu {//比如描述一个学生
	char name[10];//名字
	int age;//年龄
	int score;// 得分
};
struct stu stu1, stu2;

3.使用typedef先重命名,再声明:

//3.使用typedef先重命名,再声明: 
typedef struct stu {//比如描述一个学生
	char name[10];//名字
	int age;//年龄
	int score;// 得分
}stu;//当前面使用typedef时,分号前不再是变量声明,而是重命名后的类型

stu stu1, stu2;//声明了stu1和stu2

关于typedef重命名结构体,也可先创建结构体,再重命名:

struct stu{
	char name[10];//名字
	int age;//年龄
	int score;// 得分
};

typedef struct  stu stu;

stu stu1, stu2;

结构体的特殊声明:匿名结构体:

结构体成员的初始化、访问

初始化:

按顺序初始化:

struct stu {//比如描述一个学生
	char name[10];//名字
	int age;//年龄
	int score;// 得分
};

int main() {
	struct stu stu1 = { "mariiy",18,89 };//按顺序初始化
	return 0;
}

不按顺序初始化:

格式:.成员名=初始值

struct stu {//比如描述一个学生
	char name[10];//名字
	int age;//年龄
	int score;// 得分
};

int main() {
	struct stu stu1 = { .age=19,.name="joke",.score=90};//不按顺序初始化
	return 0;
}

访问:

直接使用变量名(操作符“.”)

格式:变量名.成员名

使用指针(操作符“->”)

格式:结构体指针->成员名


结构体的内存对齐

结构体的内存对齐描述了结构体成员在内存中的存储位置,是决定结构体内存大小的重要因素。

因为结构体内存对齐的因素存在,两个存储着同等数量、类型的结构体,会因为成员在结构体内部顺序的不同,导致占用内存大小的不同。

如:

 这时结构体大小为16字节。

我们变换一下顺序(将score移到第二位)

  这时结构体大小为20字节。

两个结构体内的成员类型、个数完全一样,只是声明顺序不一样,导致结构体大小不一样。

对齐规则:

●结构体的第一个成员对齐到偏移量为0结构体变量的起始地址处。

●其他成员要对齐到对齐数的整数倍数处(偏移量的整数倍)

        对齐数:编译器默认的对齐数与成员类型大小的较小值(数组类型大小为成员类型大小

        —vs上默认对齐数是8

        —Linux没有默认对齐数,对齐数就是成员类型大小

●结构体的总大小为最大对齐数(所有成员的对齐数中最大的那个)的最小整数倍

●如果嵌套了结构体,结构体成员会对起到它的最大对齐数(不会再与编译器的默认对齐数比较)的整数倍数处

所以我们可以分析在上面的两个结构体中内存布局:

内存布局:

 

 

 内存布局:

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

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

相关文章

Redis在互联网大厂中的应用案例分析

携程金融的Redis架构 携程金融在经过多年的演进后,形成了多层次的系统架构,其中基础数据(如用户信息、产品信息、订单信息等)由底层系统产生,并服务于所有的金融系统。这些基础数据通过统一的缓存服务(系统名utag)进行缓存。缓存数据具有全量、准实时、永久有效的特点,…

Web前端三大主流框架简介与优缺点对比分析

随着互联网的快速发展,Web前端开发技术不断进步,各种前端框架应运而生,极大地提高了开发效率和用户体验。在众多框架中,React、Vue.js 和 Angular 是目前最受欢迎的三大主流框架。本文将对它们进行详细介绍,并对它们的…

SpringCloud-面试篇(二十五)

(1)Sentinel与Hystix的线程隔离有什么差别? (2)Sentinel的限流与Gateway限流有什么差别 固定窗口计数器算法,可能再其他的时间两个窗口的交界内超过了请求阈值 ,所以就有了滑动窗口算法 滑动窗…

人工智能和机器学习的区别

目录 一、介绍人工智能 二、介绍机器学习 三、人工智能和机器学习的区别和联系? 一、介绍人工智能 先来说下人工智能,人工智能(Artificial Intelligence),英文缩写为AI,通俗来讲就是用机器去做在过去只有…

MATLAB算法实战应用案例精讲-【数模应用】多分类Logit分析(附python、R语言和MATLAB代码实现)

目录 算法原理 成对类别有序logit 簇族数据中的超散布性 条件独立性检验 SPSS-有序多分类Logistic回归 SPSSAU 参照项设置 案例应用 代码实现 R语言 逻辑回归 决策树 随机森林 支持向量机 评价分类的准确性 MATLAB python 算法原理 成对类别有序logit libr…

贪吃蛇小游戏简单制作-C语言

文章目录 游戏背景介绍实现目标适合人群所需技术浅玩Window API什么是API控制台程序窗口大小,名称设置 Handle(句柄)获取句柄 坐标结构体设置光标位置 光标属性获取光标属性设置光标属性 按键信息获取 贪吃蛇游戏设计游戏前的初始化设置窗口的大小和名称本地化设置 宽字符Waht …

MCK主机加固:智能科技,构筑网络安全的铜墙铁壁

在数字化转型的浪潮中,企业服务器的安全已成为维护业务连续性和保护数据资产的关键。MCK主机加固产品,以其创新技术,为企业提供了一个全面、智能、高效的安全解决方案。 一、智能安全监测 MCK主机加固产品采用深度学习算法,能够…

Pixi.js学习 (四)鼠标跟随、元素组合与图片位控

目录 一、鼠标移动跟随 1.1 获取鼠标坐标 1.2 鼠标跟随 二、锚点、元素组合 2.1 锚点 2.2 元素组合 三、图片图层 四、实战 例题一:完成合金弹头人物交互 例题二:反恐重击瞄准和弹痕 例题一代码: 例题二代码: 总结 前言 为了提高作…

利用flask + pymysql监测数据同步中的数据是否完整

一、背景 最近项目搞重构,将原有的系统拆分成了多个子系统。但是有数据表需要在不同系统中数据,同时为了解决项目性能最了一个很简单的方案,就是公共数据存在每个系统之中。 二、分析 分析这些表,这些表相比源数据表,表…

ArrayList和LinkedList的区别!!!

总结: 1、数据结构的实现 ArrayList:动态数组。 LinkedList:双向链表。 2、时间复杂度不同 ArrayList:O(1) LinkedList: O(n) ①:随机访问---- ArrayList > LinkedList (ArrayList采用下标&#xff0…

<<虾皮shopee来赞达lazada>>商品详情API@各区域item~get

数据采集API接口——搭建电商数据采集系统 可采集30多个电商平台数据,采集字段高达40多个,包含标题、价格、图片等; 可采集单个SKU某个时间段的全数据; 采集数据准确率高达98%。 虾皮shopee电商数据(来赞达lazada同理&…

一个数据查询导出工具

数据查询导出工具 安装说明 安装完成后在桌面会创建“数据查询导出工具”的查询工具。 程序初始化 配置数据库连接 首次运行,请先配置数据库连接 点击“数据库连接”后,会出现下面的窗体,要求输入维护工程师密码。(维护工程师密码…

Android帧绘制流程深度解析 (一)

Android帧绘制技术有很多基础的知识,比如多buffer、vsync信号作用等基础知识点很多笔记讲的已经很详细了,我也不必再去总结,所以此处不再过多赘述安卓帧绘制技术,基础知识这篇文章总结的很好,一文读懂"系列&#…

7.数据集处理库Hugging Face Datasets

数据集处理库Hugging Face Datasets Datasets 首先解决数据来源问题 使用 Datasets 下载开源数据集 Datasets.load_dataset 实现原理简介 构造 DatasetBuilder 类的主要配置 BuilderConfig 如果您想向数据集添加额外的属性,例如类别标签。有两种方法来填充BuilderConfig类或其…

web刷题记录(5)

[羊城杯 2020]easycon 进来以后就是一个默认测试页面, 在这种默认界面里,我觉得一般不会有什么注入点之类的,所以这里先选择用御剑扫扫目录看看有没有什么存在关键信息的页面 扫了一半发现,很多都是和index.php文件有关&#xff0…

【docker】adoptopenjdk/openjdk8-openj9:alpine-slim了解

adoptopenjdk/openjdk8-openj9:alpine-slim 是一个 Docker 镜像的标签,它指的是一个特定的软件包,用于在容器化环境中运行 Java 应用程序。 镜像相关的网站和资源: AdoptOpenJDK 官方网站 - AdoptOpenJDK 这是 AdoptOpenJDK 项目的官方网站&…

柯桥成人外语培训|职场商务英语剑桥国际英语口语外贸商务英语

01 “puppy love”是什么意思? 大家都知道,puppy有“幼犬,小狗”的意思,love是“爱”,那puppy love是什么意思呢?可不是字面上表达的小狗的爱哦! 其实,"puppy love"真正的…

小巧精悍的电脑磁盘分析工具,程序大小仅830KB,支持汉化。

一、简介 1、一款小巧精悍的电脑磁盘分析工具,程序大小仅830KB,支持汉化;当你启动它,指定要分析的系统盘,它会自动将文件和文件夹按照所占用空间大小从小到大可视化显示。各个文件会以大小不同的块展示出来&#xff0c…

VirtFuzz:一款基于VirtIO的Linux内核模糊测试工具

关于VirtFuzz VirtFuzz是一款功能强大的Linux内核模糊测试工具,该工具使用LibAFL构建,可以利用VirtIO向目标设备的内核子系统提供输入测试用例,广大研究人员可以使用该工具测试Linux内核的安全性。 工具要求 1、Rust; 2、修补的Q…

word空白页删除不了怎么办?

上方菜单栏点击“视图”,下方点击“大纲视图”。找到文档分页符的位置。将光标放在要删除的分节符前,按下键盘上的“Delet”键删除分页符。