自定义类型---结构体(下)和联合体

  • struct结构体--struct的对齐规则:先看一个代码:
    #include<stdio.h>
    #include<string.h>
    //struct的对齐规则
    struct S
    {char a;int b;char n;
    };
    int main()
    {struct S s;printf("%d ", sizeof(struct S));return 0;
    }

    这个代码中:打印出来的是12,但是我们知道char类型的是1个bite,int类型的是4个bite,那么不就是6个bite吗?为什么是12个呢?这就要讲到我们所说的struct的对齐规则了。它的原理其实很简单:1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处。

                          2.其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。

如果是这一个代码:

struct S s3
{char a;int b;char n;
};struct S4
{char c1;struct S3 s3;double d;
};
int main()
{struct S s4;printf("%d ", sizeof(struct S4));return 0;
}

这就需要另一个关于struct的对齐规则的是:如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。

  • 结构体的传参:t它的代码为:
    struct S
    {int data[1000];int num;
    };
    struct S s = { {1,2,3,4}, 1000 };
    //结构体传参 
    void print1(struct S s)
    {printf("%d\n", s.num);
    }
    //结构体地址传参 
    void print2(struct S* ps)
    {printf("%d\n", ps->num);
    }int mian()
    {print1(s); //传结构体 print2(&s); //传地址 return 0;
    }

    对与传参的代码,传地址比传结构体好的多。

  • 我们再来总结一下,对于strucrt结构体,只需要知道它是如何创建和初始化的,以及它的结构体内存对齐。
  • 联合体(union):它还有另一个名字叫做:共用体。它的创建和初始化则代码为:
    //联合体的创建和初始化:
    union Un
    {char c;int a;
    };
    int mian()
    {//联合体变量的定义union Un un = { 0 };//计算连个变量的大小printf("%d\n", sizeof(un));return 0;
    }

    它的输出结果:4;那就想了,为什么结构体的是12,而联合体的是4呢?这就提到了前面所说的,联合体是一个共用体。它和结构体有着本质的区别,

  • 联合体大小的计算:举一个例子:我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。 每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息,比如,设计这三个变量:图书:书名、作者、⻚数 。杯⼦:设计。 衬衫:设计、可选颜⾊、可选尺⼨。则代码为:

    struct gift_list
    {int kucun_liang;//库存量char jia_ge;//价格int item_type;//商品类型union{struct{char title[20];//书名int name[10];//作者char num_pager;//页数}book;struct{char desight[30];//设计}mug;struct{char desight[20];//设计int jian_se;//可选颜色int size;//可选尺寸}shirt;}item;
    };

    这就遇到了struct中嵌套了union。

  • 结构体和联合体就写完了,它们的最重要的一部分就是struct和union的创建和初始化以及理解。你会了吗?

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

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

相关文章

MySQl基础入门 ⑮

上一遍文章内容 使用语句创建视图 还是用上次的三个表&#xff0c;如果没有创建&#xff0c;点击上一遍文章内容创建即可。 什么叫视图 视图是一个或多个表中导出来的表&#xff0c;它是一种虚拟存在的表&#xff0c;并且表的结构数据都依赖基本表&#xff0c;通过视图不仅…

js改变图片曝光度(高亮度)

方法一&#xff1a; 原理&#xff1a; 使用canvas进行滤镜操作&#xff0c;通过改变图片数据每个像素点的RGB值来提高图片亮度。 缺点 当前项目使用的是svg&#xff0c;而不是canvas 调整出来的效果不是很好&#xff0c;图片不是高亮&#xff0c;而是有些发白 效果 代码 …

鸿蒙OS开发实例:【工具类封装-首选项本地存储】

import dataPreferences from ohos.data.preferences; import bundleManager from ohos.bundle.bundleManager; 本地首选项数据的保存&#xff0c;利用key value 【使用要求】 DevEco Studio 3.1.1 Release api 9 【使用示例】 1、app启动时&#xff0c;从本地读取数据&…

Linux文件(系统)IO(含动静态库的链接操作)

文章目录 Linux文件&#xff08;系统&#xff09;IO&#xff08;含动静态库的链接操作&#xff09;1、C语言文件IO操作2、三个数据流stdin、stdout、stderr3、系统文件IO3.1、相关系统调用接口的使用3.2、文件描述符fd3.3、文件描述符的分配规则3.3、重定向3.4、自制shell加入重…

Docker 夺命连环 15 问

目录 什么是Docker&#xff1f; Docker的应用场景有哪些&#xff1f; Docker的优点有哪些&#xff1f; Docker与虚拟机的区别是什么&#xff1f; Docker的三大核心是什么&#xff1f; 如何快速安装Docker&#xff1f; 如何修改Docker的存储位置&#xff1f; Docker镜像常…

三位数组合-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第42讲。 三位数组合&#…

项目中线程池的应用

1、首先我们需要在配置类中将线程池作为单例bean配置 Configuration public class ThreadPoolExecutorConfig {BeanExecutorService executorService(){return new ThreadPoolExecutor(2,3,0,TimeUnit.MICROSECONDS,new ArrayBlockingQueue<>(3),(r)->new Thread(r,&…

揭露非法集资陷阱!

常见的非法集资手法 犯罪分子利用了社会公众的哪些心理&#xff1f; 使用了怎样的措辞&#xff1f; 一起来揭露非法资金集聚的几个陷阱&#xff01; 拐弯抹角地向亲朋好友承诺大额回报&#xff0c;希望他们加入&#xff08;利用社会认同原则&#xff09;。 不法分子造了个传…

精灵传信系统 匿名性系统 支持网站+小程序双端源码

精灵传信支持在线提交发送短信&#xff0c;查看回复短信&#xff0c;在线购买额度&#xff0c;自定义对接易支付&#xff0c;设置违禁词&#xff0c;支持网站小程序双端。 项目 地 址 &#xff1a; runruncode.com/php/19720.html 环境要求: PHP > 73 MySQL>5.6 Ngi…

【算法-PID】

算法-PID ■ PID■ 闭环原理■ PID 控制流程■ PID 比例环节&#xff08; Proportion&#xff09;■ PID 积分环节&#xff08;Integral&#xff09;■ PID 微分环节&#xff08;Differential&#xff09; ■ PID PID 分别是 Proportion&#xff08;比例&#xff09;、 Integr…

RK3588平台开发系列讲解(硬件篇-最小系统设计)

目录 系统概述 概述 系统框图 应用框图 最小系统设计 时钟&#xff1a; 复位/看门狗/TSADC电路&#xff1a; 系统启动引导顺序&#xff1a; 系统概述 概述 RK3588 是一颗高性能、低功耗的应用处理器芯片&#xff0c;由4个Cortex-A76和4个Cortex-A55 及独立的 NEON协处理…

编程语言|C语言——C语言变量的存储方式

前言 变量是程序中数据的存储空间的抽象。变量的存储方式可分为静态存储和动态存储两种。 静态存储变量通常是在程序编译时就分配一定的存储空间并一直保持不变&#xff0c;直至整个程序结束。在上一部分中介绍的全局变量的存储方式即属于此类存储方式。 动态存储变量是在程序执…

C++自主点餐系统

一、 题目 设计一个自助点餐系统&#xff0c;方便顾客自己点餐&#xff0c;并提供对餐厅销售情况的统计和管理功能。 二、 业务流程图 三、 系统功能结构图 四、 类的设计 五、 程序代码与说明 头文件1. SystemMap.h #pragma once #ifndef SYSTEMMAP #define SYSTEMMAP #in…

集体出走的Stability AI 发布全新代码大模型,3B以下性能最优,超越Code Llama和DeepSeek-Coder

Stability AI又有新动作&#xff01;程序员又有危机了&#xff1f; 3月26日&#xff0c;Stability AI推出了先进的代码语言模型Stable Code Instruct 3B&#xff0c;该模型是在Stable Code 3B的基础上进行指令调优的Code LM。 Stability AI 表示&#xff0c;Stable Code Instru…

3款免费甘特图制作工具的比较和选择指南

GanntProject GanttProject https://www.ganttproject.biz/ 是一款项目管理和调度应用&#xff0c;适用于 Windows、macOS 和 Linux。它易于使用&#xff0c;无需任何设置&#xff0c;适用于个人用户和小型团队。该应用提供任务层次结构和依存关系、里程碑、基准行、Gantt 图表…

WordPress Git主题 响应式CMS主题模板

分享的是新版本&#xff0c;旧版本少了很多功能&#xff0c;尤其在新版支持自动更新后&#xff0c;该主题可以用来搭建个人博客&#xff0c;素材下载网站&#xff0c;图片站等 主题特点 兼容 IE9、谷歌 Chrome 、火狐 Firefox 等主流浏览器 扁平化的设计加响应式布局&#x…

BioXcell InVivoPlus anti-mouse Ly6G及部分参考文献

BioXcell InVivoPlus anti-mouse Ly6G 1A8单克隆抗体与小鼠Ly6G反应。Ly6G分子量为21-25kDa&#xff0c;是GPI锚定的细胞表面蛋白Ly-6超家族的成员&#xff0c;在细胞信号传导和细胞粘附中发挥作用。Ly6G在发育过程中由骨髓谱系中的细胞&#xff08;包括单核细胞、巨噬细胞、粒…

android 集合总结

1 集合分类&#xff0c; collection和map两大类,Iterator接口是提供遍历任何Collection的接口&#xff0c;不是map 2 集合类的底层实现 hashset基于hashmap实现&#xff08;只不过HashSet里面的HashMap所有的value都是同一个Object而已&#xff09; treeset由红黑树实现 …

ES6—Module 的语法

export命令 ES6 模块的设计思想是尽量的静态化&#xff0c;使得编译时就能确定模块的依赖关系&#xff0c;以及输入和输出的变量。 模块功能主要由两个命令构成&#xff1a;export和import。export命令用于规定模块的对外接口&#xff0c;import命令用于输入其他模块提供的功…

什么是根据人类反馈的强化学习Reinforcement Learning with Human Feedback(RLHF)?

基于人类反馈的强化学习&#xff08;Reinforcement learning with human feedback&#xff09;是近年来越来越受欢迎的一种前沿技术&#xff0c;用于提高大型语言模型的性能。这是种使用人类反馈训练这些模型的有效方法&#xff0c;而该方法的输入组件与搜索评估也有诸多相似之…