结构体,联合体,枚举( 1 )

目录

前言

1.结构体

1.1结构体的声明

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

1.3结构体成员的访问字符

1.4结构体的内存大小

1.4.1对齐规则

1.5结构体传参


前言

        在编程的世界里,数据结构的选择对于程序的效率和可读性有着至关重要的影响。不同的数据结构适用于不同的场景,能够帮助我们更好地组织和管理数据。在本文中,我们将探讨三种常用的数据结构:结构体(Struct)、联合体(Union)和枚举(Enum),它们在C语言及其衍生语言中扮演着重要的角色。

1.结构体

        结构体(Struct)是一种复合数据类型,它允许我们将多个不同类型的数据项组合成一个单一的类型。这种能力使得结构体非常适合用于表示现实世界中的对象,比如一个员工的个人信息,可以包括姓名、年龄、职位等。结构体的使用可以提高代码的可读性和可维护性,因为它通过将相关的数据项封装在一起,使得数据的组织和访问变得更加直观。

1.1结构体的声明

例如描述一个学生:

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

这里采用了成员顺序初始化和指定顺序初始化两种方法,可以根据自己的需求自行选择。

1.3结构体成员的访问字符

上述例子中已经引用了结构体成员访问字符的一种( . ),这里再来详细的介绍一下结构体成员的访问字符。

如果你有一个指向结构体的指针,你可以使用箭头操作符(->)来访问成员变量。下面是一个使用指针访问结构体成员的例子:

结果为:

这里我们也可以在指针前加上解引用符来使用点操作符。

结果依旧是相同的

1.4结构体的内存大小

结构体的内存大小就是所有成员内存大小的和吗?

这里给出个例子来看看:

结果为:

从结果上来看结构体的内存不是我们一开始所想的那么简单。

其实计算机给结构体分配内存的时候会遵循一个内存对齐规则。

1.4.1对齐规则

这里vs的对齐数默认为8。

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

下来用代码和图示帮助大家理解结构体的内存对齐规则:

int main() {struct S1{char c1;int i;char c2;};printf("%d\n", sizeof(struct S1));
}

运行结果为:

那么他是在内存中是怎么存储的呢?

 

        第一个成员char对齐到和结构体变量起始位置偏移量为0的地址处,第二个成员变量int 对齐到它本身内存大小的倍数的位置,也就是表中的4。表中灰色部分为浪费的内存字节。第三个成员变量char和第二个成员存储规则相同也要对齐到它本身内存大小的倍数的位置,即对齐到第8个字节。最后结构体的内存总大小为最大对齐数的整数倍,也就是12。

        趁热打铁再来看看这个结构体的内存大小。

int main() {struct S2{char c1;char c2;int i;};printf("%d\n", sizeof(struct S2));
}

结果为:

那这个结构体是怎么存储呢?

是不是和你想的一样呢。

1.5结构体传参

上述的print1和print2函数哪个好一些呢?

答案是首选print2函数

原因是:

所以结论:

结构体传参的时候,要传结构体的地址。

C语言的联合体和枚举在下一篇博客,期待再见!

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

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

相关文章

19. 变量

文章目录 一、变量二、变量的定义格式 一、变量 变量:程序中临时存储数据的容器,在程序执行过程中,其值有可能发生改变的量(数据)。但是这个容器中只能存一个值。 应用场景:在我们登录页面的时候&#xf…

C++多重继承与虚继承

多重继承的原理 多重继承(multiple inheritance)是指从多个直接基类中产生派生类的能力。 多重继承的派生类继承了所有父类的属性。 在面向对象的编程中,多重继承意味着一个类可以从多个父类继承属性和方法。 就像你有一杯混合果汁,它是由多种水果榨取…

46.continue语句

目录 一.continue语句 二.视频教程 一.continue语句 continue语句的作用和break语句很像&#xff0c;break语句会跳出当前循环&#xff0c;而continue语句则是跳出本次循环&#xff0c;继续执行下一次循环。 举个例子&#xff1a; #include <stdio.h>void main(void)…

蓝桥杯练习题总结(三)线性dp题(摆花、数字三角形加强版)

目录 一、摆花 思路一&#xff1a; 确定状态&#xff1a; 初始化&#xff1a; 思路二&#xff1a; 确定状态&#xff1a; 初始化&#xff1a; 循环遍历&#xff1a; 状态转移方程&#xff1a; 二、数字三角形加强版 一、摆花 题目描述 小明的花店新开张&#xff0c;为了吸…

计算机组成原理 — 指令系统

指令系统 指令系统指令的概述指令的格式指令的字长取决于 操作数类型和操作种类操作数的类型数据在存储器中的存放方式操作类型 寻址方式指令寻址数据寻址立即寻址直接寻址隐含寻址间接寻址寄存器寻址寄存器间接寻址基址寻址变址寻址堆栈寻址 RISC 和 CISC 技术RISC 即精简指令…

「AI作曲家」Suno 使用 v3 在几秒钟内创作完整的两分钟歌曲

Suno 被誉为“音乐界的 ChatGPT”,它的独特之处在于能够根据简单的提示,自主创作包括歌词、人声和配器在内的完整音乐作品。更令人惊叹的是,你可以引导它精确地选择任何想要的音乐风格,从古老的三角洲蓝调到现代的电子寒潮,它还能灵活运用各种方言。 Suno 正在开启一个全…

【学习笔记】java项目—苍穹外卖day01

文章目录 苍穹外卖-day01课程内容1. 软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境 2. 苍穹外卖项目介绍2.1 项目介绍2.2 产品原型2.3 技术选型 3. 开发环境搭建3.1 前端环境搭建3.2 后端环境搭建3.2.1 熟悉项目结构3.2.2 Git版本控制3.2.3 数据库环境搭建3.2.4 前…

使用certbot为网站启用https

1. 安装certbot客户端 cd /usr/local/bin wget https://dl.eff.org/certbot-auto chmod ax ./certbot-auto 2. 创建目录和配置nginx用于验证域名 mkdir -p /data/www/letsencryptserver {listen 80;server_name ~^(?<subdomain>.).ninvfeng.com;location /.well-known…

【Linux】 centos7安装卸载SQL server(2017、2019)

一、安装配置 准备一个基础Linux配置&#xff1a; 内存为20GB 运行内存为2GB的系统&#xff08;数据库小于2GB安装不了&#xff09; 1、网络配置 我们需要进行网络的连接 进入 cd /ect/sysconfig/network-script/ 编辑文件ifcfg-ens33 vi ifcfg-ens33 Insert键进行编辑 把ONBOO…

2024最新Win系统下VSCode下载安装与配置C/C++教程

2024最新Win系统下VSCode下载安装与配置C/C教程 文章目录 2024最新Win系统下VSCode下载安装与配置C/C教程1、下载安装VSCode2、安装运行时环境GCGC的环境配置 3、安装VSCode插件4、配置程序调试环境4.1确定文件存储路径4.2新建文件夹【.vscode】4.3在.vscode文件夹里新建四个配…

学透Spring Boot — [二] Spring 和 Spring Boot的比较

欢迎关注我们的专栏 学透 Spring Boot 一、创建一个简单Web应用 本篇文章&#xff0c;我们将会比较 Spring 框架和 Spring Boot 的区别。 什么是 Spring? 也许你在项目中已经可以很熟练的使用 Spring 了&#xff0c;但是当被问到这个问题时&#xff0c;会不会犹豫一下&#…

轻松赚钱,精彩生活:上班族副业赚钱新攻略大揭秘!

薪水总是捉襟见肘&#xff0c;每月账单总让人倍感压力。你是否曾在静谧的夜晚&#xff0c;躺在床上&#xff0c;思索如何为家庭多赚一分钱&#xff1f;其实&#xff0c;你并不孤单。在这个充满机遇与挑战的时代&#xff0c;越来越多的人开始寻找副业&#xff0c;以期望让生活更…

QT控件之显示控件

Qt Designer显示窗口部件提供的面板中&#xff0c;提供了10种显示小部件 &#xff08;1&#xff09; Label标签 &#xff08;2&#xff09; Text Browser文本浏览器 &#xff08;3&#xff09; Graphics View图形视图 &#xff08;4&#xff09; Calendar Widget日历 &…

【Bug-ModuleNotFoundError: No module named ‘models‘】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 出现这个错误&#xff1a; 出现了ModuleNotFoundError: No module named models’的问题。 文件在Model…

【操作系统复习之路】操作系统概述(复习的同学有福啦)

长话短说&#xff0c;就记下笔记&#xff0c;期待期末90&#xff0c;随便希望能帮助到有需要的同学。 目录 一、操作系统的目标和作用 二、操作系统的发展过程 2.1 无OS 2.2 有OS 【1】批处理系统 【2】分时系统 【3】实时操作系统 【4】三种基本操作系统的比较&#…

域环境共享文件夹,容量配额管理

首先&#xff0c;我们先创建一个新的磁盘&#xff0c;必须在服务器关机的状态下创建&#xff0c;只有在关机状态下才能创建NVMe类型的磁盘。 打开此电脑&#xff0c;右击创建的磁盘&#xff0c;点击属性。 点击共享&#xff0c;点击高级共享。 将共享此文件夹勾选上&#xff0c…

从代码到可执行到运行的整体流程与原理

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言 本篇文章将会介绍&#xff0c;磁盘中是如何存储一个文件&#xff0c;磁盘中的文件是如何从磁盘中加载进内存&#xff0c;与进程又有怎样的关系&#xff0c;我们写的代码变成可执行程序执行起来时如何完成对文件的一系列…

ubuntu系统下如何使用vscode编译和调试#小白入门#

编程环境&#xff1a;ubuntu系统为18.04.1&#xff0c;vscode版本为1.66.2 一、VSCode切换中文显示&#xff1a; 1、vscode安装完成后启动,在左侧externsions中搜索“简体中文”插件&#xff0c;并完成安装&#xff1a; 2、选择右下角齿轮形状的"Manage"&#xff…

YOLOv5全网独家改进: 红外小目标 | 注意力机制改进 | 并行化注意力设计(PPA)模块,红外小目标暴力涨点 | 2024年3月最新成果

💡💡💡本文独家改进:红外小目标涨点利器,在多个数据集下进行验证,其中并行化 patch-aware 注意力(PPA)模块,解决目标的大小微小以及红外图像中通常具有复杂的背景的问题点 💡💡💡红外小目标实现暴力涨点,只有几个像素的小目标识别率大幅度提升 改进结构图如…

算法---动态规划练习-7(按摩师)【类似打家劫舍】

按摩师 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 首先&#xff0c;给定一个整数数组 nums&#xff0c;其中 nums[i] 表示第 i 天的预约时间长度。 定义两个辅助数组 f 和 g&#xff0c;长度都为 n&#xff08;n 是数组…