【C语言-进阶】自定义类型详解(结构体+枚举+联合)

2023-11-02

结构体的声明与定义

s0,s1,s2都是struct Stu 的别名,即结构体的重命名。(这种情况下就不可以在声明的同时定义变量了)

sp,spp都是sturct Stu类型的

n1为结构体声明的同时定义变量,在下面重新赋值时不能只写n1,还要加上struct Stu。

如果没有对结构体重命名,比如sturct node类型,则在其他作用域中定义变量时,必须加上struct

结构体的自引用

不可以包含struct node n1;只能包含结构体指针。

必须写struct node* 不可写node*

结构体内存对齐

结构体内存对齐是用来计算结构体所占内存的大小的。

首先得掌握结构体的对齐规则:

1. 第一个成员在与结构体变量偏移量为0的地址处。

2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的值为8,linux中无默认对齐数,每个成员的对齐数为该成员大小。

3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

例一:

c1为第一个成员,存放在与结构体变量偏移量为0的地址处。

整型成员i:默认对齐数为8,自身大小为4,取较小值为4,所以存放在偏移量为4的地址处,占用4,5,6,7.之后c2的对齐数为1(1,8取较小值)存放在偏移量为8地址处,此时所有变量存储完毕,根据规则3:结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。所以最大对齐数为4,此时所占内存为9字节,不是4的整数倍,所以向后拓展3个字节。最终占用内存为12个字节。

例2:

 同上

例三:

 同上

例四: 

 c1对齐数为1,s3自身大小为16(上一个例子),默认对齐数为8,取8,所以存放在8偏移量的地址处,占16字节,后面再存放d。存放完毕后占32个字节。此时所有成员的最大对齐数为8,(这里并不看s3整体,而是看s3的成员)32为8的整数倍。所以最终占用32个字节。

设计结构体时,让占用空间小的成员尽量集中在一起。可以在满足对齐的基础上节省空间。 (例如例一和例二)

修改默认对齐数

 

结构体传参

函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的 下降。

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

位段

 位段不多应用,大致如上图所示,具有不跨平台性

枚举

枚举:一一列举,类似于#define但是又不同于#define

枚举的使用

 

 联合体(共用体)

a和b公用同一段内存空间,所以称为共用体,可以看到ab的初始地址相同,赋值b为0x55之后,因为char b正好只占1个字节,8bit位,也就是两个16进制位,内存中对应地址处的数据就会被改变。(注:sizeof(u) = 4) 

联合体的使用

 

 当给a赋值1时,转化为16进制即0x00000001。如果机器为小端存储,则b所占内存中存储的就是01,如果是大端存储,b所占内存中存储的就是00 以此来判断机器是大端还是小端。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C语言-进阶】自定义类型详解(结构体+枚举+联合) 的相关文章

随机推荐

  • VC++6.0 IDE的工程用Code::Blocks来打开、编译、调试终极配置方案

    引子 竟然可以用Code Blocks来打开 编译 调试VC 6 0的项目 感觉很神奇 通过配置也让我们更进一步了解VC 6 0的编译器 连接器 调试器 好多兄弟问到要是能支持最新的VS2008和VS2010就好了 其实Code Block
  • SQL数据表层面操作(DDL)

    DDL Data Definition Language 数据定义语言 用于对数据库和数据表的操作 因为操作对象有两个 数据库和数据表 所以我们要在每个命令之后 create drop alter show后面加上database或者tab
  • jstat使用详解(jvm问题排查)

    jstat命令使用 jstat命令可以查看堆内存各部分的使用量 以及加载类的数量 命令的格式如下 jstat 命令选项 vmid 间隔时间 毫秒 查询次数 注意 使用的jdk版本是jdk8 类加载统计 C Users Administrat
  • 联盟链选型之FISCO BCOS

    算起来从去年12 31开始 到现在 已经快满三个月了 这三个月 阅读了各种区块链白皮书 腾讯的 华为的 京东的 可信区块链组织的 组织了一份 dfgx区块链解决方案 参加了华为组织的区块链生态 其实主要是推他自己的目录链 目前区块链这个概念
  • 快递E栈项目实战第二阶段

    快递E栈项目实战第二阶段 文章目录 快递E栈项目实战第二阶段 1 阶段二需求 2 模块分析 3 代码结构和运行截图 4 源码 1 阶段二需求 2 模块分析 1 V视图展示 欢迎 菜单 子菜单 2 D数据存储 快递数据 gt 存取媒介更改为数
  • urllib的使用

    See PyCharm help at https www jetbrains com help pycharm import urllib request 设置关闭本地验证 import ssl import urllib parse s
  • 文件流之文件输出流FileOutputStream

    一 介绍 FileOutputStream实现了向文件中写入byte数据的方法 二 打印数据到文件 package com imooc io import java io FileOutputStream import java io IO
  • 机器学习sklearn-支持向量机1

    目录 相关概念 线性SVM决策过程的可视化 相关概念 支持向量机的分类方法 是在这组分布中找出一个超平面作为决策边界 使模型在数据上的 分类误差尽量接近于小 尤其是在未知数据集上的分类误差 泛化误差 尽量小 边际很小的情况 是一种模型在训练
  • Out of memory

    环境 Ubuntu Server 12 04 i686 问题描述 24G内存 空闲的有20G左右 但是内核老是报这个 动不动就杀程序 Jul 6 13 12 44 00098 kernel 3112325 883069 Out of mem
  • 利用mongodb实现分布式WEB图片存储

    利用mongodb实现分布式WEB图片存储 2012 12 22 14 00 33 标签 mongodb 分布式图片存储 nginx 分布式网站 的确在站比较小得时候 附件不多的时候 当然这样处理很好 但是当 附件数量海里去了 那这样存就蛋
  • Sass中@each、@for、@if的搭配使用

    CSS 预处理器赋予了 CSS 逻辑编程的能力 其中 Sass Less Stylus 最受欢迎 语法都是大同小异 上手也很快 在项目中使用最多的可能要数 Sass 了 本文就讲讲 Sass 中循环遍历 each for 和 if 判断的搭
  • SpringBoot 返回json数据 的几种方式

    一 RestController RequestMapping RestController public class TestController RequestMapping public User test User user new
  • LeetCode/LintCode 题解丨一周爆刷字符串:URL 编码

    描述 给出一个代表网址 host 的字符串 base url 和代表查询参数的列表 query params list 你需要返回带查询参数的完整 URL 查询参数列表由一些包含两个元素的数组组成 数组第一个元素代表参数 数组第二个元素代表
  • 8-js高级-4

    JavaScript 进阶 4 深浅拷贝 浅拷贝 浅拷贝 把对象拷贝给一个新的对象 开发中我们经常需要复制一个对象 如果直接赋值 则复制的是地址 修改任何一个对象 另一个对象都会变化 常见方法 拷贝对象 Object assgin 展开运算
  • postgresql安装报错

    postgresql安装报错 版本问题 版本问题 第一次下载安装postgresql 进到官网 随便点了一个12得版本进行下载 postgresql 12 12 1 windows x64 下载后双击运行 直接提示 百度了一圈 有说 用管理
  • Python实战RBF神经网络

    程序员A 哥们儿 最近手头紧 借点钱 程序员B 成啊 要多少 A 1000行不 B 咱俩谁跟谁 给你凑个整 这1024 拿去吧 之前我们讲了神经网络 人工神经网络是受到人类大脑结构的启发而创造出来的 这也是它能拥有真智能的根本原因 在我们的
  • pycharm创建py脚本自动增加注释和描述

    pycharm创建py脚本自动增加注释和描述 创建脚本时可自动带入简单注释 设备 MAC 注释内容如下 Time DATE TIME Author fanzw File NAME py Description 可自由扩展 效果如下
  • JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)

    如果想了解Java内存模型参考 jvm内存模型 和内存分配以及jdk jre jvm是什么关系 阿里 美团 京东 相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题 有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制
  • 《C++ System Programming Cookbook》第一章读书笔记

    阅读书籍 C System Programming Cookbook 记录 使用docker linux 用户管理常见命令 adduser 创建用户 login 用户登录 passwd 修改用户密码 usermod a G 用户加入组 us
  • 【C语言-进阶】自定义类型详解(结构体+枚举+联合)

    结构体的声明与定义 s0 s1 s2都是struct Stu 的别名 即结构体的重命名 这种情况下就不可以在声明的同时定义变量了 sp spp都是sturct Stu类型的 n1为结构体声明的同时定义变量 在下面重新赋值时不能只写n1 还要