C语言从头学39——结构体位字段、弹性数组成员

1、struct位字段
       位字段是C语言 struct 的一种特殊数据结构,它的属性(这里称为字段)由二进制位组成,适合操作二进制数据。每个属性的取值只有整数且不会出现负值,故数据类型为 unsigned int。
      位字段结构体的声明格式举例:
      typedef struct
      {
          unsigned int a : 1; //a:1表示这个属性a占1个二进制位
          unsigned int b : 1;
          unsigned int c : 1;
          unsigned int d : 1;
      } binStruct;
       上面这个例子,a、b、c、d四个字段共计占了四个二进制位,但我们用 sizeof 计算位字段结构体的大小时,得到的却是4个字节。4个位与4个字节差很多啊?原因是C语言在存储位字段结构时,是按照int类型占用的字节数进行存储的,一个位字段结构如不超过int字节数则其占用的空间就是1个int类型所占字节数,所以上面的例子显示的大小是4个字节。
       但当一个位字段结构超过int字节数,且正好有一个字段跨在两个int字节之间,这样的情况程序是会出问题的,怎样处理呢?可以在跨字节字段的前面加上一个有类型、无字段名、占位为0的字段(unsigned int :0),这个字段属占位字段,可以把跨字节字段挤到下一个int字节中;这种情况再用sizeof计算位字段结构的大小,就会是8个字节。总之,一个字段所在位置绝不能跨在两个int字节之间。
       位字段的优点就是节省内存空间,比如RGB颜色,就是r、g、b三组0~255之间的数值组合而成的,白色(255,255,255)、红色(255,0,0),灰
色(211,211,211),为储存这些数据,我们定义一个位字段:
       typedef struct
        {
            unsigned int r : 8; 
            unsigned int g : 8;
            unsigned int b : 8;
        } Color;
       用Color这个位字段结构存储rgb颜色值,三组数只用了4个字节,实际4个字节还没用满,剩余的部分还可以另做它用。

2、struct弹性数组成员
       数组在使用前有时不能确定组成员的准确数量。如果声明数组的时候,宽打窄用给一个很大的数字,会造成浪费内存空间。为此,C语言提供了一个利用结构体解决的方法,叫做弹性数组成员。具体做法是,可以定义一个struct结构,里面正常的成员该怎样设置就怎样设置,和弹性数组成员有关的是两个:a.记录弹性数组成员个数的 int 变量;b. char、int或其它类型 (含自定义结构体) 的弹性数组。举例:
      typedef struct
      {
           int lenth;
           char myChar[];
       } myCharArr;
       上例中,myCharArr结构体有两个属性。lenth属性用来记录数组myChar的长度,myChar是一个字符数组,但是没有给出成员数量。myChar数组准确成员数,可以在为myCharArr初始化时确定。再举一个int型完整例子进一步说明使用方法:

//位字段结构体
typedef struct
{unsigned int a : 1; //a:1表示这个属性a占1个二进制位unsigned int b : 1;unsigned int c : 1;unsigned int d : 1;
} binStruct;
//带有弹性数组成员的结构体
typedef struct
{int lenth;int myInt[];
} myIntArr;
#include<stdio.h>
#include<stdlib.h> //malloc需用
int main(void)
{
//位字段结构的字节数printf("binStruct size=%lld\n", sizeof(binStruct)); //运行结果:binStruct size=4//位字段结构体最小为一个int类型所占字节数
//弹性数组成员int n = 10; //声明 (假定现在要使用一个10个成员数组)myIntArr* myintarr = malloc(sizeof(myIntArr) + n * sizeof(int));if (myintarr == NULL) return 0;//赋值myintarr->lenth = n;for (int i = 0; i < myintarr->lenth; i++){myintarr->myInt[i] = i * 100+100;}//遍历for (int i=0;i<myintarr->lenth;i++){printf("myInt[%i] %i\n", i,myintarr->myInt[i]);//运行结果:略}getchar();return 0;
}

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

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

相关文章

大数据采集汇聚系统研究

大数据采集汇集系统是一种能够广泛收集、处理和存储来自多种数据源的海量数据的系统。该系统在现代企业管理和决策中发挥着至关重要的作用&#xff0c;为企业提供了强大的数据支持和分析能力。以下是对大数据采集汇集系统的详细介绍&#xff1a; 一、系统概述 大数据采集汇集…

八股文”在实际工作中是助力、阻力还是空谈?

“八股文”在实际工作中是助力、阻力还是空谈&#xff1f; 作为现在各类大中小企业面试程序员时的必问内容&#xff0c;“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢&#xff1f;有IT人士不禁发出疑问&#xff1a;程序员面试考…

Laravel序列化解码:深入Eloquent模型的序列化机制

Laravel序列化解码&#xff1a;深入Eloquent模型的序列化机制 引言 Laravel作为一门优雅的PHP Web开发框架&#xff0c;提供了许多便利的功能来简化开发过程。其中一个强大而易用的功能便是模型的序列化。序列化是将对象状态转换为可以存储或传输的格式的过程。在Laravel中&a…

DNS、网关、IP、DHCP

DNS、网关、IP、DHCP&#xff1a;深入剖析与理解 在计算机网络的世界中&#xff0c;DNS、网关、IP和DHCP是四个至关重要的概念&#xff0c;它们共同构建了互联网的基础架构&#xff0c;确保了数据的准确传输和设备的有效连接。本文将深入剖析这四个概念&#xff0c;帮助读者更…

《动手做科研 》| 03. 如何阅读人工智能研究论文

地址链接:《动手做科研》03. 如何阅读人工智能研究论文 导读: 在刚迈入科研时&#xff0c;人人都说读论文很重要&#xff0c;但是很少有人能完整地教你应该如何读论文。论文不仅揭示了行业的最新进展和趋势&#xff0c;而且为我们提供了改进技术和解决复杂问题的思路。然而&…

==和equals的区别以及为什么重写hashcode

对于基本数据类型是比较值&#xff0c;引用数据类型比较地址是否相等&#xff1b;equals一般是比较对象的地址&#xff0c;但是具体分析&#xff0c;如integer里面的equal&#xff0c;就是用里面的基本数据类型int的值取比较的。 integer缓存机制&#xff1a;用 a5,或者a Inte…

【JAVA】JAVA学习网站推荐

一、简介 为了让大家和自己不错过优质的JAVA学习网站&#xff0c;我会在不断的学习过程中补充完善此篇章&#xff1b; 二、推荐网站 1、大白菜导航 推荐理由&#xff1a;介绍java,又不止介绍java;智者见智吧&#xff1b; 后续更新中…

JDK-ForkJoinPool

归档 GitHub: JDK-ForkJoinPool JDK 版本 openjdk version "17.0.12" 2024-07-16 OpenJDK Runtime Environment Temurin-17.0.127 (build 17.0.127) OpenJDK 64-Bit Server VM Temurin-17.0.127 (build 17.0.127, mixed mode, sharing)测试 Slf4j public class Mi…

《学会 SpringBoot · 参数校验》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

经纬恒润天津研发中心实验室荣获CNAS权威认证

近日&#xff0c;经纬恒润天津研发中心实验室成功通过中国合格评定国家认可委员会(CNAS)的严格扩项评审&#xff0c;正式被授予CNAS认可证书。此次认证&#xff0c;是经纬恒润实验室在原有CNAS实验室基础上&#xff0c;再添天津研发中心这一重要检测阵地&#xff0c;是对经纬恒…

重生奇迹MU自由选择个性大师之路

自由选择大师技能 每一个大师职业都拥有三条大师技能树&#xff0c;每一条大师技能树对职业加强的侧重点各不相同。玩家可以根据自己喜欢专一选择&#xff0c;一条路走到底&#xff1b;当然也可以同时兼修两条或者三条技能树&#xff0c;做到雨露均沾。每一种选择都没有绝对的…

【linux】Linux中环境变量相关操作的详细教程及实战案例

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

实验2-3-2 计算摄氏温度

//实验2-3-2 计算摄氏温度#include<stdio.h> int main(){int C, F;scanf("%d",&F);C5*(F-32)/9;printf("Celsius %d",C);}

【Hive SQL】数据探查-数据抽样

文章目录 数据随机抽样1、随机数排序抽样&#xff08;rand()&#xff09;2、数据块抽样&#xff08;tablesample()&#xff09;3、分桶抽样 数据随机抽样 在大规模数据量的数据分析及建模任务中&#xff0c;往往针对全量数据进行挖掘分析时会十分耗时和占用集群资源&#xff0c…

kafka leader选举过程浅析

文章目录 概要核心概念leader选举具体流程小结 概要 kafka我们都知道它是通过副本机制&#xff0c;来支持负载均衡和故障转移等高可用的&#xff0c;那么具体副本的选举过程你了解吗&#xff1f;下面我们一起来学习下吧&#xff01; 核心概念 Controller定义&#xff1a;是特…

文献综述如何帮助研究人员避免现有研究的重复

VersaBot一键生成文献综述 进行良好的文献综述可以作为研究人员的有力工具&#xff0c;避免在多个方面重复现有研究&#xff1b; 1.揭示现有知识&#xff1a; 通过努力探索过去的研究&#xff0c;研究人员可以全面了解其领域中已经探索和建立的内容。这些知识使他们能够确定真…

linux系统iptable防火墙开放指定ip及端口

在Linux系统中&#xff0c;可以使用iptables命令来配置防火墙并开放指定IP的端口。下面是一些常用的命令示例&#xff1a; 1. 检查当前防火墙规则&#xff1a; iptables -L这个命令将列出当前的防火墙规则。 2. 开放TCP端口&#xff1a; iptables -A INPUT -s xxx.xxx.xxx.…

Linux基础操作(下)

软件安装&#xff0c;CentOS系统和Ubuntu是使用不同的包管理器 CentOS使用yum管理器&#xff0c;Ubuntu使用apt管理器 在CentOS系统中&#xff0c;使用yum命令联网管理软件安装 yum语法: yum [-y] [install | remove | search ] 软件名称 在Ubuntu系统中&#xff0c;使用apt命…

ShardingSphere实战(1)- 分库分表基础知识

一、为什么要分库分表 分库分表是一种数据库优化策略&#xff0c;主要用于解决大型应用或高并发场景下数据库性能瓶颈的问题。具体来说&#xff0c;分库分表可以带来以下好处&#xff1a; 提高性能&#xff1a; 减少单个数据库实例的负载&#xff0c;避免单点性能瓶颈。当数据…

Python. 协程asyncio、gevent

1、协程是一种轻量级的并发机制&#xff0c;允许你在单个线程内模拟并发执行多个任务。协程非常适合用于 I/O 密集型任务&#xff0c;如网络请求、文件读写等&#xff0c;在等待 I/O 操作完成时&#xff0c;协程可以继续执行其他任务而不是阻塞。 生成器: 协程的基础是生成器&a…