C语言:结构体

news2024/9/29 11:39:49

1、结构体:

定义:结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量
结构的声明:

struct tag
{
     member-list;
     
}variable-list;

举例:声明一个学生类型,想通过学生类型来创建学生变量(对象)
描述学生的属性:名字-电话-性别-年龄

struct Stu
{
    char name[20];//名字
    char tele[12];//电话
    char sex[10];//性别
    int age;//年龄
};

结构体初始化:

struct Stu a={"张三","1008611","男生",20};
printf("%s %s %s %d\n",a.name,a.tele,a.sex,a.age);

匿名结构体类型:

struct//标签可以省略
{
    int a;
    char b;
}x;//但是变量列表不能省略

匿名结构体指针:

struct
{
    int a;
    char b;
}*pa;

2、结构体自引用:

后面讲数据结构的链表与这相似

struct node
{
    int data;
    struct node*next;
};

3、结构体内存对齐:

这也是一个特别热门的考点
考点如何计算?结构体对齐规则:
1、第一个成员在与结构体变量偏移量为0的地址处。
2、其他变量成员要对齐到某个数字(对齐数)的整数倍的地址处,对齐数=编译器默认的一个对齐数与该成员大小的较小值,VS编译器默认对齐数为8,gcc编译器没有默认对齐数(官方说的,但是网上有人说是4)
3、结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
4、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

为什么存在内存对齐?
大部分参考资料都是这样说的:
1.平台原因(移植原因)不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

总体来说:
结构体的内存对齐是拿空间来换取时间的做法

那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:让占用空间小的成员尽量集中在一起。

修改默认对齐数:
#pragma这个预处理指令,可以改变我们的默认对齐数
例如:

#include <stdio.h>
#pragma pack(8)//设置默认对齐数为8
struct s1
{
    char c1;
    int i;
    char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认

offsetof函数:计算结构体偏移量

size_t offsetof(struct Name, member Name);

引用头文件#include <stddef.h>

例如:

#include <stddef.h>
struct s
{
   char c;
   int a;
   double b;
};

int main()
{
   printf("%d\n",offsetof(struct s,c));
   printf("%d\n",offsetof(struct s,a));
   printf("%d\n",offsetof(struct s,b));
}

百度笔试题:
写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明
考察:offsetof宏的实现
注:这里还没学宏,等后面学了宏再实现

4、结构体传参

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

例如:

struct Stu
{
    char name[20];//名字
    char tele[12];//电话
    char sex[10];//性别
    int age;//年龄
};

void print(struct Stu*ps)
{
   printf("%s %s %s %d\n",ps->name,ps->tele,ps->sex,ps->age);
}

int main()
{
   struct Stu s={0};
   print(&s);
}

5、结构体实现位段

什么是位段?
位段的声明和结构是类似的,有两个不同
1.位段的成员必须是int unsigned int成signed int。
2.位段的成员名后边有一个冒号和一个数字
位段中的位是指二进制位

例如:

struct A
{
   int a:2;//指a只需要占2个比特位
   int b:5;//b只需要占5个比特位
   int c:10;//c只需要占10个比特位
   int d:30;//d只需要占30个比特位
}

A就是一个位段类型
那位段A的大小是多少呢?

printf("%d\n",sizeof(struct A));

位段的内存分配
1.位段的成员可以是int unsigned int signed int或者是char(属于整形家族)类型
2.位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的
3.位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段

位段的跨平台问题
1.int位段被当成有符号数还是无符号数是不确定的。
2.位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32写成27,在16位机器会出问题。
3.位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义
4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,舍弃剩余的位还是利用,这是不确定的。

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

位段的应用:
在这里插入图片描述

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

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

相关文章

【Matplotlib绘制图像大全】(二十七):Matplotlib将数组array保存为图像

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

SpringBoot+Vue实现前后端分离的大学生志愿者管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

【C++修炼之路】10. vector类

每一个不曾起舞的日子都是对生命的辜负 vector本节目标1. vector的介绍及使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义&#xff08;构造函数&#xff09;1.2.2 vector iterator的使用1.2.3 vector的空间增长问题1.2.4 vector增删查改2. vector的模拟实现2.1 构造函…

Mellanox CX4 offload 卸载功能介绍

无状态功能卸载 cx4支持多种类型的无状态卸载&#xff0c;如下面列表所示。 Checksum OffloadLarge Send OffloadsReceive Side ScalingTransmit Side ScalingInterrupt ModerationLarge Receive OffloadsVLAN insertion and strippingFlow Steering at layers 2, 3 and 4Pac…

使用MotionLayout实现模拟启动页动画和轮播图

目录效果图展示启动页效果轮播图效果MotionLayout详解准备工作正题轮播图效果实现ConstraintSetTransitionCarousel浅述启动页的实现插入gif图源码在这里&#xff1a; 源码链接本文是用java写的效果图展示 下面是本博客我使用真机所实现的功能展现&#xff0c;方便大家根据自身…

化妆品行业的数字进化论:S2B2B电商网站如何助力化妆品企业打造增长新动能

近年来&#xff0c;伴随着国家经济的快速发展和消费者对“美”的追求日益强烈&#xff0c;大大推动了化妆品行业的蓬勃发展&#xff0c;根据公开数据显示&#xff0c;2021年我国化妆品零售总额达4026亿元&#xff0c;较2020年同比增长18.40%&#xff0c;我国目前已成为全球第二…

一篇文章让你全方位掌握git版本控制管理

注&#xff1a;侵权请联系作者删除 目录 1.引入&#xff1a; 2.Git 的工作区域和流程 3.stash区域 4.git基本操作 A.git add B.git commit c.git pull D.git fetch E.git branch F.git init 5.在项目中实际运用案例&#xff1a; A.在github上创建一个新仓库 B.复制刚创建…

matlab使用hampel滤波,去除异常值

此示例显示了Hampel用于检测和删除异常值的过程的 实现。 最近我们被客户要求撰写关于hampel滤波的研究报告&#xff0c;包括一些图形和统计输出。 产生一个包含24个样本的随机信号x。 重置随机数生成器以获得可重复的结果。 rng defaultlx 24; x randn(1,lx); 围绕x的每…

网页前端知识汇总(六)——如何让网页全部内容显示成灰色

最近很多做网站前端的技术员是不是都接到了老板的任务&#xff0c;让网站的网页显示效果都变成灰色&#xff0c;这个也是随某些事件的发生或者某些专题内容觉得需要这样做的&#xff0c;大部分用于大家都不愿意看到的专题事件如某某烈士&#xff0c;逝去的伟人等&#xff1b;大…

Scala013--Scala中的方法

因为Scala是一种函数式编程语言&#xff0c;因此在Scala中基本上都是方法和函数&#xff0c;但是需要注意的是&#xff0c;在Java中方法和函数是同一个意思&#xff0c;但是在Scala中函数和方法的含义不同&#xff1a; 方法&#xff1a;是类和对象的成员函数&#xff1a;是对象…

jeecgboot-前端组件封装代码示例

首先我们要知道 jeecgboot他前台的组件代码封装文件夹的位置在src-components中&#xff0c;这时我们其实可以观察他们代码的写法(个人感觉学习代码的最好的途径就是临摹他人高质量的代码、多看、多写)路径如图&#xff1a; 接下来我们会在标注3下实现一个简单的自定义组件 代码…

【Eureka】【源码+图解】【八】Eureka客户端的服务获取

【Eureka】【源码图解】【七】Eureka的下线功能 目录7. 获取服务7.1 初始化HeartBeat的task7.2 将task进一步包装成定时timerTask7.3 定时时间到&#xff0c;执行timeTask7.4 task获得线程资源&#xff0c;执行refreshRegistry()7.5 服务端接受请求7.6 获取Applications7. 获取…

Spark - RDD 的分区和Shuffle

一、RDD 的分区 前面在学习 MapReduces 的时候就提到分区&#xff0c;在RDD中同样也存在分区的概念&#xff0c;本质上都是为了提高并行度&#xff0c;从而提高执行的效率&#xff0c;那在 Spark 中的分区该怎么设置呢&#xff1f; 首先分区不是越多越好&#xff0c;太多意味…

[Android]Logcat调试

Android采用Log(android.util.log)工具打印日志&#xff0c;它将各类日志划分为五个等级。 Log.e 打印错误信息 Log.w 打印警告信息 Log.i 打印一般信息 Log.d 打印调试信息 Log.v 打印冗余信息 不同等级的日志信息&#xff0c;在日志栏中会以不同颜色和等级(E、W、…

(附源码)ssm医院挂号系统 毕业设计 250858

医院挂号系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对医院排队挂号等问…

深入理解 Python 描述符

学习 Python 这么久了&#xff0c;说起 Python 的优雅之处&#xff0c;能让我脱口而出的&#xff0c; Descriptor&#xff08;描述符&#xff09;特性可以排得上号。 描述符 是Python 语言独有的特性&#xff0c;它不仅在应用层使用&#xff0c;在语言语法糖的实现上也有使用到…

【java基础系列】16- Java中怎么处理异常?

Java的异常处理 1、异常的概念 概念&#xff1a;程序在运行过程中出现的不正常现象。出现异常不处理将终止程序运行。异常处理的必要性&#xff1a;任何程序都可以存在大量的未知问题、错误&#xff1b;如果不对这些问题进行正确处理&#xff0c;则可能导致程序的中断&#x…

[附源码]Python计算机毕业设计SSM开放性实验室网上预约管理(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

分布式和可再生系统建模(simulink)

目录 1 可再生/微电网概述 1.1 分布式和可再生系统建模和仿真 1.2 解决工作流程 1.3 能源管理系统监控设计 1.4 验证控件的测试网格规范和IEEE标准 1.5 部署算法和代码生成 1.6 网格集成研究控制器的实时测试 2 微电网案例 2.1 简介 2.2 在 Simulink 中实现微电网…

【JavaEE】初识操作系统,吃透进程

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01; &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:初始操作系统&#xff0c;进程的概念 &#x1f680;&#x1f680;代码存放仓库gitee&#xff1a;JavaEE初阶代码存放&#xff01; ⛵⛵…