64.【C语言】再议结构体(下)

news2024/9/30 11:11:25

本文衔接第63篇63.【C语言】再议结构体(上)

目录

目录

6.复习

7.修改默认对齐数

8.结构体传参

01.传递非指针参数

02.传递指针参数(传递地址)

03.对比

9.结构体实现位段

01.位段的定义

02.格式

03.例题

答案速查

分析

10.位段跨平台问题

11.位段的应用

12.其他注意事项



6.复习

20.【C语言】初识结构体(重要)

48.【C语言】结构体补充

63.【C语言】再议结构体(上)

7.修改默认对齐数

加一条预处理指令

#pragma pack(对齐数)
struct 结构体标签
            {
 
                 成员列表;
 
            }变量列表(全局变量);//变量列表可以不写,但;必须有!!!

 在#pragma pack(对齐数)后紧跟着结构体就能指定该结构体的对齐数

建议给1,2的次方数:2,4,8

#include <stdio.h>
#pragma pack(1)
struct s1
{
	char a;
	char b;
	int c;
};
#pragma pack()//恢复默认对齐数

int main()
{
	printf("%zd", sizeof(struct s1));
	return 0;
}

打印结果为6

8.结构体传参

01.传递非指针参数

#include <stdio.h>
struct s
{
	int data[1000];
	int num;
};

void sim_print(struct s ss)//结构体传参
{
	int i = 0; 
	for (i = 0; i < 5; i++)
	{
		printf("%d ",ss.data[i]);
	}
	printf("\nnum = %d\n", ss.num);
}

int main()
{
	struct s s = { { 1, 2, 3, 4, 5 } , 100 }; 
	sim_print(s);
	return 0;
}

 649fedba905547ce98c30e0799df9aa3.png

f592253b4fb1450b9a35f9439c373d9e.png

02.传递指针参数(传递地址)

#include <stdio.h>
struct s
{
	int data[1000];
	int num;
};

//结构体传参,*ps表明传递的是指针
void sim_print(struct s *ps)
{
	int i = 0; 
	for (i = 0; i < 5; i++)
	{
		printf("%d ",ps->data[i]);
	}
	printf("\nnum = %d\n", ps->num);
}

int main()
{
	struct s s = { { 1, 2, 3, 4, 5 } , 100 }; 
	sim_print(&s);//传的是地址
	return 0;
}

注:结构体成员变量->成员名是结构体特有的写法

03.对比

当结构体成员变量占用较大的内存时, 因为参数要压栈,所以传递指针参数比传递非指针参数要节省空间,传递指针参数不会另外开辟额外的空间

9.结构体实现位段

01.位段的定义

摘自百度百科:

C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”(bit field),利用位段能够用较少的位数存储数据

02.格式

类型 成员变量:数字;

如: int a:5;

03.例题

求下列代码的执行后位段在内存中的数据(在VS2022中测试)

struct S
{
	char a : 3;
	char b : 4;
	char c : 5;
	char d : 4;
};

int main()
{
	struct S s = { 0 };//注意区分大小写
	s.a = 10;
	s.b = 12;
	s.c = 3;
	s.d = 4;
	return 0;
}

答案速查

位段在内存中的数据:62 03 04

分析

因为 以位为单位来指定其成员所占内存长度

前置知识:位段的内存分配

2条规则,1条提醒

1.位段的成员可以是int,unsigned int,signed int,char等类型

2.位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的

提醒:位段涉及很多不确定因素,位段不跨平台,注重可移植的程序应该避免使用位段(本文后面会单独讲)

位段的内存分配

1.数据的存储顺序由是编译器而定(C标准没有规定)

2.每次向CPU申请1byte,如果不够则继续申请1byte

3.是否浪费空间取决于编译器(C标准没有规定)

解析

未存储数据时:

8b54a2c5b70741d3a0b31291363bed7c.png

分类讨论:

若按浪费空间处理

由低地址向高地址存储,设数据的二进制的存储顺序为从右向左(VS2022满足此情况)

十进制10==二进制1010 十进制12==二进制1100 十进制3==二进制11 十进制4==二进制100

    char a : 3;-->a占3位,1010会被截断为3位010存储
    char b : 4;-->b占4位,恰好可以存储1100
    char c : 5;-->c占5位,11占2位,因此补前导零存储为00011
    char d : 4;-->d占4位,100占3位,因此补前导零存储为0100

bca644ba52134c04bde9d4f35623ab84.png

 按十六进制拆分:0110 0010 0000 0011 0000 0100-->62 03 04

位段的空间以4个字节(int)或者1个字节(char)的方式来开辟的,a,b,c,d的类型全为char,因此不用改动为62 03 04 00

验证

VS2022+x64+debug环境下,VS2022调试,F11逐语句

打开内存窗口,输入&s(小写的s)

1c00e7ec857d4297977fbc51bd1b0aa2.pngde85388a6fd34fba86f07a8793c38583.png

b340dfd98b364e48a8e49e951e5cce55.png

03d67f85d9544c539904305d7925596c.png

176711e990a04735b45453832a1434b8.png

10.位段跨平台问题

1.int 位段被当成有符号数还是无符号数是不确定的(即最高位为1还是0不确定)

2.位段中最大位的数目不能确定

例如:int a : 34;

a为34位,在16位和32位机器均不能存储,但在64位机器可以

3.位段中的成员在内存中的存储顺序为从左向右还是从右向左,C标准尚未定义

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

因此跟结构相比,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在

11.位段的应用

下图是网络协议中IP数据报的格式,可以看到其中很多的属性只需要几个bit位就能描述

这里使用位段能节省了空间,这样网络传输的数据报大小也会较小一些,对网络的畅通是有帮助的。

12.其他注意事项

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

int a=0;
scanf("%d",&a);
s.a = a;

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

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

相关文章

ubuntu20.04系统下,c++图形库Matplot++配置

linux下安装c图形库Matplot&#xff0c;使得c可以可视化编程&#xff1b;安装Matplot之前&#xff0c;需要先安装一个gnuplot&#xff0c;因为Matplot是依赖于此库 gnuplot下载链接&#xff1a; http://www.gnuplot.info/ 一、gnuplot下载与安装(可以跳过&#xff0c;下面源码…

EasyCVR视频汇聚平台:解锁视频监控核心功能,打造高效安全监管体系

随着科技的飞速发展&#xff0c;视频监控技术已成为现代社会安全、企业管理、智慧城市构建等领域不可或缺的一部分。EasyCVR视频汇聚平台作为一款高性能的视频综合管理平台&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;在构建智慧安防/视频监控系统中展现出了…

如何设计能吸引下载的截图以及注意事项

应用商店优化包括两个方面&#xff1a;关键字优化&#xff08;吸引人们查看您的应用页面&#xff09;和屏幕截图优化&#xff08;将浏览量转化为下载量&#xff09;。两者相互依存&#xff0c;两者相辅相成&#xff0c;让您的应用获得应有的下载量。但是&#xff0c;如果浏览量…

MySQL_视图

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

计算机毕业设计Python抖音可视化 抖音大数据分析 抖音爬虫 抖音用户行为分析 抖音大数据 Hadoop Spark 数据仓库 推荐系统 机器学习 深度学习

Python抖音可视化开题报告 一、研究背景与意义 随着移动互联网的迅猛发展&#xff0c;短视频平台如抖音已成为人们日常生活中不可或缺的一部分。抖音以其独特的算法和内容推荐机制&#xff0c;吸引了数以亿计的用户。然而&#xff0c;随着用户规模的不断扩大&#xff0c;如何…

海信给AI电视打样,12大AI智能体全面升级大屏体验

9月29日&#xff0c;海信在秋季新品发布会上正式推出了百吋AI新品阵容&#xff0c;通过全新升级的ULED AI画质平台和行业首发的12大电视AI智能体&#xff0c;再一次引领AI电视创新方向&#xff0c;让用户在任意环境和场景下享受超高画质体验。同时可以用最简单的交流获得最想要…

WingetUI:可视化Windows常用的命令行包管理工具

推荐一个Windows工具&#xff0c;可以轻松地下载、安装、更新和卸载任何在支持的包管理器上发布的软件。 01 项目简介 WinGetUI 是一个基于 .NET 的开源项目&#xff0c;它旨在提供一个图形用户界面&#xff08;GUI&#xff09;来管理包&#xff0c;支持命令比如 Winget、Sco…

Javase学习day1-前置知识

1、什么是计算机 2、 硬件及冯诺依曼结构 3、软件及软件开发 4、常用的快捷键 5、常用的Dos命令 常用的Dos命令&#xff1a;(基本都是在cmd里面写的) #盘符切换&#xff1a;直接输入那个盘符的名字加一个冒号就行。 #切换目录&#xff1a; cd change directory&#xff08;这是…

阿里云ACP认证考试题库

最近有好些同学&#xff0c;考完阿里云ACP了&#xff0c;再来跟我反馈&#xff1a;自己花700买的阿里云ACP题库&#xff0c;结果答案是错的&#xff01; 或者考完后发现&#xff0c;买的阿里云ACP题库覆盖率只有50%&#xff01; 为避免大家继续踩坑&#xff0c;给大家分享一个阿…

【机器学习】自动驾驶——智能交通与无人驾驶技术的未来

自动驾驶技术是近年来最热门的人工智能应用之一。它结合了机器学习、计算机视觉、传感器融合以及复杂的算法&#xff0c;推动了智能交通系统的发展。随着技术的不断进步&#xff0c;自动驾驶不仅有望改变个人出行方式&#xff0c;还将对城市交通、物流配送以及公共安全产生深远…

虚拟机如何固定IP地址(VMware+centos7)图文教程

创建虚拟机后进行ip固定 关闭上面的界面 安装下面的图片打开网络编辑器 打开管理员权限 安装图中进行配置 打开ssh客户端&#xff08;这里使用的是Mobaxterm&#xff09; 输入以下命令 #直接复制粘贴 cd /etc/sysconfig/network-scripts/ ls 例 然后编辑文件 ifcfg-ens33 …

ArduSub程序学习(11)--EKF实现逻辑④

1.controlFilterModes() controlFilterModes() 是 NavEKF2_core 类中的一个关键函数&#xff0c;用于控制和管理扩展卡尔曼滤波器&#xff08;EKF&#xff09;的不同工作模式。该函数在 UpdateFilter 方法中被调用&#xff0c;确保滤波器根据系统状态&#xff08;如飞行状态、…

云中红队系列 | 使用 Azure FrontDoor 混淆 C2 基础设施

重定向器是充当 C2 服务器和目标网络之间中间人的服务器。其主要功能是重定向 C2 和受感染目标之间的所有通信。重定向器通常用于隐藏 C2 服务器流量的来源&#xff0c;使防御者更难以检测和阻止 C2 基础设施。 基于云的重定向器提供了一个很好的机会&#xff0c;通过内容分发…

万界星空科技MES系统,打造数字化转型小灯塔企业

小灯塔工厂是一个相对的概念&#xff0c;它可能指的是在数字化转型和智能制造方面取得一定成就&#xff0c;但尚未达到全球“灯塔工厂”标准的企业。这些企业可能已经在生产过程中运用了数字化、网络化和智能化的手段&#xff0c;提高了生产效率和质量&#xff0c;降低了制造成…

NASA:ATLAS/ICESat-2 L3 B每月网格动态海洋地形V002

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATLAS/ICESat-2 L3B Monthly Gridded Dynamic Ocean Topography V002 简介 ATLAS/ICESat-2 L3 B每月网格动态海洋地形V002 该数据集包含了每月网格动态海洋地形&#xff08;DOT&#xff09;&#…

EE trade:试金石怎么辨别真假黄金

试金石&#xff0c; 作为一种古老而有效的工具&#xff0c; 在漫长的历史长河中&#xff0c; 一直被人们用于鉴别真假黄金。 它利用黄金的独特物理性质&#xff0c; 通过简单的摩擦测试&#xff0c; 便能快速判断出黄金的真伪。 那么&#xff0c; 试金石究竟是如何帮助我们识别…

【C++掌中宝】类和对象(二):隐藏的this指针

文章目录 引言1. 定义与用法1.1 隐式存在的 this 指针1.2 this 指针的用途与示例 2. 本质3. 特点4. this 指针的作用机制5. 成员函数中的 this 指针6. 空指针与 this 指针的特殊情况7. 注意事项8. 总结结语 引言 在 C 编程中&#xff0c;类是面向对象编程的核心&#xff0c;而…

帆软报表替代产品有哪些?

帆软报表历经十余年的发展&#xff0c;功能极为强大。然而&#xff0c;其用户界面稍显老旧&#xff0c;使用过程也较为繁琐。近几年涌现出了一些相当优秀的报表工具。 1. 积木报表 特点&#xff1a;积木报表 JimuReport&#xff0c;是一款免费的数据可视化报表&#xff0c;含报…

基于SSM的少儿编程网上报名系统 【附源码】

基于SSM的少儿编程网上报名系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统的功能结构图 4.2 数据库概念结构设计 4.2.1 数据库E-R图 4.2.2 数据库逻辑结构设计 第五章 系统功能实现 5.1管理员功能模块 5.2用户功能模块 5…

【基础算法总结】分治--快排+归并

目录 一&#xff0c;分治算法介绍二&#xff0c;算法原理和代码实现75.颜色划分912.排序数组-快速排序215.数组中的第k个最大元素(快速选择算法)LCR159.最小的k个数(快速选择算法)912.排序数组-归并排序LCR170.数组中的逆序对315.计算右侧小于当前元素的个数493.翻转对 三&…