【C语言进阶篇】自定义类型:结构体(下)

【C语言进阶篇】自定义类型:结构体(下)

🌈个人主页:开敲-CSDN博客

🔥所属专栏:C语言_开敲的博客-CSDN博客

🌼文章目录🌼 

1. 结构体传参

  2. 结构体实现位段

    2.1 什么是位段

    2.2 位段的内存分配

    2.3 位段的跨平台问题

    2.4 位段的应用

    2.5 位段使用的注意事项

1. 结构体传参

  

                                         上述两种传参形式哪种好?答案是第二种。

  第一种直接传结构体的形式,在形参部分接收也要用到一个结构体,这也意味着需要再次开辟一块空间来存放形参的结构体。而第二种使用指针来接收结构体地址,则不需要额外开辟空间。

  2. 结构体实现位段
    2.1 什么是位段

  首先要知道,位段是基于结构体的。

  位段的声明和结构体类似,但是有两点不同:

①  位段的成员只能是 intunsigned int signed int 或者 char,位段中的成员类型必须相同(在C99中位段的成员也可以选择其他类型)

②  位段的成员名后面跟着一个冒号:  和一个数字(这个数字代表分配给成员的比特位数),比如:

                              

这里的 就是一个位段类型。

 那么 A 所占的内存大小是多少呢?先来看结果:

为什么是8呢,我们紧接着就来讲位段的内存分配。

    2.2 位段的内存分配

    我们前面知道了位段中成员类型的限制,那么这里就可以引出:位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。这里我们举个例子:

这里的大小是 个字节,为什么呢?这就需要我们画图理解位段的内存分配来解决这个问题了:

  

  不难知道,位段在开辟空间时,根据成员的需求开辟空间,不够了再开辟。由此也可以知道,为了代码的可读性和维护性,建议使位段的成员是相同或相似类型。

    2.3 位段的跨平台问题

①  int 位段在不同平台被当成 signed int 还是 unsigned int 是不确定的。

②  位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。

③  位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。

④  当⼀个结构包含两个位段,第二个位段成员比较大,无法容纳于第⼀个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。

  总结:位段和结构体相比可以达到相同的效果并且更加节省空间,但是存在跨平台问题。

    2.4 位段的应用

  在网络协议中,就用到了位段,下图是网络协议中,IP数据报的格式,我们可以看到其中很多的属性只需要几个bit位就能描述,这里使用位段,能够实现想要的效果,也节省了空间,这样网络输的数据报大小也会较小⼀些,对网络的畅通是有帮助的。

    2.5 位段使用的注意事项

  位段的几个成员共有同⼀个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位置处是没有地址的。内存中每个字节分配⼀个地址,⼀个字节内部的bit位是没有地址的。
所以不能对位段的成员使用&操作符,这样就不能使⽤scanf直接给位段的成员输入值,只能是先输入放在⼀个变量中,然后赋值给位段的成员。

  

struct A
{
	int a : 2;
	int b : 5;
	int c : 10;
	int d : 30;
};


int main()
{
	struct A sa = { 0 };
	scanf("%d", &sa.b);//这是错误的
	//正确的⽰范
	int b = 0;
	scanf("%d", &b);
	sa.b = 4;
	return 0;
}

                                                  创作不易,点个赞呗,谢谢啦~

    

                                            

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【CSS】html滚动条相关

1.滚动条样式 ::-webkit-scrollbar {width: 10px;height: 10px;z-index: 101; } ::-webkit-scrollbar-thumb {border-radius: 5px;background: #cecece; } ::-webkit-scrollbar-track {// background: #f5f5f5be;background: rgba(33, 85, 163, 0); } ::-webkit-scrollbar-but…

mysql - 多表访问

多表访问 创建两个表 mysql> SELECT * FROM t1; ------------ | m1 | n1 | ------------ | 1 | a | | 2 | b | | 3 | c | ------------ 3 rows in set (0.00 sec)mysql> SELECT * FROM t2; ------------ | m2 | n2 | ------------ | 2 | …

IP地址的分配:数字世界的地址规划者

在互联网的世界里,IP地址扮演着类似于房屋地址的角色,是用于标识和定位互联网上每个连接到网络的设备的唯一标识符。然而,这些IP地址并非随意分配,而是经过精心规划和管理的。本文将探讨IP地址的分配方式,揭示数字世界…

婴儿洗衣机十大排名名牌:十款超高价值婴儿洗衣机综合整理

我们都知道宝宝的皮肤是超级娇嫩的,宝宝的衣物也一样,宝宝的衣物大部分都是纯棉的。如果将宝宝的衣物和大人衣服一起扔进大型洗衣机混洗,更可能出现细菌交叉感染,对小宝宝来说百害而无一利,会让小宝宝肌肤过敏、红肿、…

有关Theano和PyTensor库

根据Github里面的介绍,PyTensor是源于Theano, Theano目前应该已经不再开发了,更新都是很多年前。 因此PyTensor在背景介绍中说 PyTensor is a fork of Aesara, which is a fork of Theano. Theano和PyTensor都是计算相关的库,可以…

【C语言】结构体类型名、变量名以及typedef

文章目录 分类判断结构体成员的使用typedef 分类判断 struct tag {char m;int i; }p;假设定义了上面这一个结构体,tag 就是类型名, p 就是变量名, m 和 i 就是结构体成员列表。 可以这么记,括号前面的是类型名,括号后…

2024年超声波清洗机选购攻略,高性价超声波清洗机推荐,看这篇就够

随着科技的飞速发展和生活品质的逐步提升,超声波清洗机已经成为了现代家庭不可或缺的清洁工具。它以独特的超声波清洁技术,能够深入物品的微小缝隙,有效去除污垢和细菌,为用户提供一种安全、高效且环保的清洁解决方案。2024年&…

处理器方法的参数

处理器方法的参数: 处理器方法可以包含以下四类参数,这些参数会在系统调用时由系统自动赋值,即程序员可在方法内直接使用: HttpServletRequestHttpServletResponseHttpSession请求中所携带的请求参数 控制器方法: 前面三个参数怎…

Android 系统源码快速入门

Android源码快速入门 今天分享的内容是Android源码快速入门,主要分为以下几个步骤: * 硬件要求 * 虚拟机安装 * 开发环境搭建 * 下载编译源码 * 从一个简单的实际开发需求体验 Framework 开发硬件要求 用于 Android Framework 开发的电脑需要较强的 C…

黑平台避雷!3月上半月FX110曝光68家,无监管成常态

黑平台层出不穷,反诈骗是一场长期的斗争。以半个月为周期,FX110网对虚假交易商进行常态化曝光,极力压缩黑平台的生存空间,减少骗局的发生。 3月上半月,FX110网再曝光黑平台68家,此次曝光的黑平台大都对监管…

深入探究process.env.NODE_ENV如何区分环境

公众号:程序员白特,欢迎一起学习交流~ 通常我们在开发中需要区分当前代码的运行环境是dev、test、prod环境,以便我们进行相对应的项目配置,比如是否开启sourceMap,api地址切换等。 而我们区分环境一般都是通过process.…

02_设计模式

文章目录 设计模式设计模式分类UML类图设计模式的原则 常用设计模式创建型设计模式单例设计模式饿汉模式懒汉模式(线程不安全)懒汉模式(线程安全)- Synchronized懒汉模式(线程安全)- Double Check懒汉模式&…

mysql不等于<>取特定值反向条件的时候字段有null值或空值读取不到数据

#小李子9479# 有如下的数据结构 &#xff0c;st_dl tinyint(4)&#xff0c;想从中读取不等于1的数据 于是写了一个sql语句 select * from tbname where st_dl<>1 返回数据为0。 修改一下 select * from tbname where IFNULL(st_dl,0)<>1 正确返回数据 IFNUL…

【深度学习与神经网络】MNIST手写数字识别1

简单的全连接层 导入相应库 import torch import numpy as np from torch import nn,optim from torch.autograd import Variable import matplotlib.pyplot as plt from torchvision import datasets, transforms from torch.utils.data import DataLoader读入数据并转为ten…

深度学习之本地部署大模型ChatGLM3-6B【大模型】【报错】

文章目录 0.前言1.模型下载2.配置环境2.1 下载项目文件2.2 配置环境 3.开始推理4.总结 0.前言 本博客将介绍ChatGLM3-6B大模型在Ubuntu上的本地部署教程 1.模型下载 由于毛毛张的服务器服务无法科学上网&#xff0c;所以模型的相关文件必须现在本地下载好&#xff0c;再上传到…

【ai技术】(1):发现一个大模型可视化项目,使用nodejs编写的,llm-viz,可以本地运行展示大模型结构。

1&#xff0c;关于项目 https://www.bilibili.com/video/BV1eF4m1c7NC/ 【ai技术】&#xff08;1&#xff09;&#xff1a;发现一个大模型可视化项目&#xff0c;使用nodejs编写的&#xff0c;llm-viz&#xff0c;可以本地运行展示大模型结构。 https://github.com/bbycroft/l…

k8s集群架构维护k8s集群以及搭建k8s集群以及k8s集群的常见问题

一、k8s架构 Kubernetes&#xff08;K8s&#xff09;是一个由Google主导开发的开源容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它的设计目标是简化容器化应用程序在生产环境中的部署和运营。Kubernetes的架构设计复杂且高效&#xff0c;主要包括以下几…

再谈EMC Unity存储系统内存DIMM问题

以前写过一篇关于EMC Unity 存储系统的DIMM的介绍文章&#xff0c;但是最近还是遇到很多关于内存的问题&#xff0c;还有一些退货&#xff0c;所以有必要再写一篇关于EMC Unity 内存方面的问题&#xff0c;供朋友们参考。如果还有疑问&#xff0c;可以加vx&#xff1a;StorageE…

v-bind 绑定 class 与 style 基础用法

使用 v-bind 指令绑定 class 和 style 时语法相对复杂一些&#xff0c;这两者是可以互相替代的&#xff0c;均用于响应更新HTML元素的属性&#xff0c; v-bind 绑定 class 属性可以改写成绑定 style 属性&#xff0c;只是 css 属性位置变了而已。 1. 绑定 class 属性 1.1 数组…

MySQL 数据库设计范式

第一范式&#xff08;1NF&#xff09; 每一列都是不可分割的原子数据项第二范式&#xff08;2NF&#xff09; 在1NF的基础上&#xff0c;非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖) 1.函数依赖A->B&#xff0c;如果通过A属性(属性组)的值…
最新文章