C语言进阶(6)——结构体

news2024/11/23 15:46:03

文章目录

  • 1.结构体的基础知识
  • 2.结构体的声明
  • 3.特殊的声明
  • 4.结构体的自引用
  • 6. 结构体的内存对齐
  • 7.修改默认对齐数
  • 8.结构体传参
  • 位段
    • 1、位段定义
    • 2. 位段的内存分配
    • 3.位段的跨平台问题
    • 4.位段的运用场景

1.结构体的基础知识

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

2.结构体的声明

描述一个学生

struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}; //分号不能丢

3.特殊的声明

//匿名结构体类型
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20], *p

p=&x;此时是违法的,两个变量是不同的类型。

4.结构体的自引用

//代码1
struct Node
{
int data;
struct Node next;
};
//可行否?

这样是不行的,此时的结构体是无法知道有多大的。

//代码2
struct Node
{
int data;
struct Node* next;
};

这样才是正确的,此时就是链表的结点;

//代码3
typedef struct
{
int data;
Node* next;
}Node;
//这样写代码,是不行的。编译是有顺序的,无法识别此时的Node
//解决方案:
typedef struct Node
{
int data;
struct Node* next;
}Node;

6. 结构体的内存对齐

知道如何定义结构体之后,就应该要确定结构体的大小。
对齐规则
在这里插入图片描述
这样规则的意义
在这里插入图片描述

7.修改默认对齐数

#include <stdio.h>
#pragma pack(8)//设置默认对齐数为8
struct S1
{
char c1;
int i;
char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认
#pragma pack(1)//设置默认对齐数为1
struct S2
{
char c1;
int i;
char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认
int main()
{
  printf("%d\n", sizeof(struct S1));//12
  printf("%d\n", sizeof(struct S2));//6
  return 0;
}  

#progma pack(num)//设置默认对齐数为num
#progma pack()//取消设置的默认对齐数,还原为默认值

8.结构体传参

struct S
{
int data[1000];
int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s);  //传结构体
print2(&s); //传地址
return 0;
}

print1和print2相比,传址会比传值好一点,节省空间。

位段

1、位段定义

位段的声明和结构和结构体类似,有两个不同:
位:二进制位。

1.位段的成员必须是整型家族;
2.位段的成员后面必须要有一个冒号和一个数字。

在这里插入图片描述

2. 位段的内存分配

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

3.位段的跨平台问题

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

和结构体相比,位段可以达到相同的效果,但是可以很好节约空间,但存在跨平台问题。

4.位段的运用场景

在这里插入图片描述
可以对里面的成员进行大小的指定,节省空间。

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

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

相关文章

51单片机——LED基础

从小就对电器元件比较感兴趣吧&#xff0c;经常拿坏的电器里面的芯片拆下来玩&#xff0c;甚至那些没坏的电器&#xff0c;比如我家的电视&#xff0c;也会希望它能坏掉&#xff0c;我好去看看里面是什么样子的&#xff0c;为什么能播放节目……&#xff0c;所以我第一眼看到51…

阿里云-解决EDAS创建应用文件过大无法上传部署问题

文章目录1、背景2、问题具体描述3、解决方案3.1、 2种方案3.2 、OSS 简介3.3、 OSS 功能特性4、 OSS 实操4.1、 上传程序文件4.2、 创建应用1、背景 在一次使用阿里云-EDAS发布应用服务过程中出现EDAS 上传应用包过大无法上传现象。 2、问题具体描述 最近在使用阿里云-EDAS发…

1.1.2续 特殊二极管部分选型

目录 1.稳压管 2.发光二极管 4.光电二极管 5.整流二极管 1.稳压管 利用二极管的反向击穿特性制成的&#xff0c;在电路中其两端的电压保持基本不变&#xff0c;起到稳定电压的作用 Vz 稳定电压&#xff1a;反向击穿后稳定工作的电压 Iz 稳定电流&#xff1a;工作电压等于…

Java异常情况了解

作者&#xff1a;爱塔居的博客_CSDN博客-JavaSE,数据结构领域博主 专栏&#xff1a;JavaSE 作者介绍&#xff1a;大三学生&#xff0c;希望一起进步~ 文章目录 目录 文章目录 一、异常结构体系 二、异常分类 三、异常处理 3.1异常抛出 3.2 异常捕获 四.【面试题】 五、题目练习…

大数据必学Java基础(一百一十九):Maven仓库与JDK的配置

文章目录 Maven仓库与JDK的配置 一、Maven仓库 二、JDK的配置 Maven仓库与JDK的配置 一、Maven仓库 Maven仓库是基于简单文件系统存储的,集中化管理Java API资源(构件)的一个服务。 仓库中的任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路…

Linux:gcc工具

文章目录一.程序的翻译二.gcc工具的使用2.1gcc 文件名(直接编译)2.2gcc -o 自定义 原文件(自定义生成可执行程序名称)2.3./可执行文件2.4gcc -E(程序运行到预处理后结束)2.5gcc -S(程序运行到编译之后结束)2.6gcc -i(程序运行到汇编之后结束)2.7小结三.链接的过程3.1ldd命令3.2…

2023年最新谷歌Google帐号Gmail邮箱账号怎么注册成功的方法与教程?

因为工作、游戏或其他需求&#xff0c;有时需要使用谷歌Google帐号或Gmail邮箱账号。首先明确&#xff1a;谷歌google帐号不一定是Gmail邮箱帐号&#xff0c;但是Gmail邮箱账号一定是谷歌帐号。所以&#xff0c;大家注册Google谷歌帐号时默认为谷歌Gmail邮箱帐号就可以满足谷歌…

Linux基础命令,常用操作

Linux基础命令Linux的目录结构ls命令(list)隐藏文件、文件夹pwd命令(print work directory)cd命令(change directory)HOME目录相对路径、绝对路径特殊路径符mkdir命令(make directory)touch命令(touch)cat命令more命令cp命令mv命令rm命令(remove)which命令find命令grep命令wc命…

私有云建设,ALLINONE还是分层自主建设优化?

新钛云服已累计为您分享720篇技术干货私有云建设有两种思路&#xff0c;一种是使用整合解决方案&#xff0c;即ALLINONE的思路。一种是将私有云分层每层自主建设&#xff0c;使用不同的产品和解决方案分层优化组合使用。两种思路各有优缺点&#xff0c;适合不同的场景。一、ALL…

Mybatis-plus(上)

1.什么是mybatis-plus升级版的mybatis&#xff0c;目的是让mybatis更易于使用&#xff0c; 用官方的话说“为简化而生”官网&#xff1a;https://baomidou.com/初体验按照官网中的快速开始即可1.准备数据库脚本数据库 Schema 脚本如下&#xff1a; DROP TABLE IF EXISTS user; …

javaWeb RequestResponse

Request Request 继承体系 Tomcat解析请求数据&#xff0c;封装为request对象&#xff0c;并且创建request对象传递到service方法中 。Java提供了接口&#xff0c;tomcat的RequestFacade提供了实现。 Request 获取请求数据 请求数据分为3部分&#xff1a; 请求行&#xff…

一台手机即可完成 3D 建模,功能有多强大? #Luma AI

AIGC 的出现拓展了内容生产的诸多可能&#xff0c;借助 AI 技术来进行 3D 建模&#xff0c;可以节省不少的时间&#xff0c;市面上也出现了许多功能强大的 3D 建模工具。1 月 9 日&#xff0c;AppStore 上架了一款名为“Luma AI”的软件&#xff0c;能够将现实中的 2D 照片快速…

通过Terraform创建GCP Pubsub

1 简介 Terraform是管理许多平台的基础设施的工具&#xff0c;如AWS、GCP和Azure。这篇文章将讲解如何通过Terraform来管理GCP Pub/Sub。 创建GCP项目请参考&#xff1a;初始化一个GCP项目并用gcloud访问操作 2 Terraform创建Pub/Sub 2.1 下载Terraform插件 我们需要安装G…

【Blende UV映射01】创建UV 使用UV贴图处理纹理

写在前面 这是进行云渲染的最后一步&#xff0c;实践&#xff01;&#xff01; 会跟着这个Blender 2.8 UV Mapping教程快速学习一边UV映射的东西&#xff0c;已经是最最最最基础的了。 本文是教程的P1-P7的过程记录。 1 UV映射 拿一个3D物体&#xff0c;怎么去切割它&…

1301. C 循环(扩展欧几里得算法)

题目如下&#xff1a; 思路 or 题解: 抽象出数学公式&#xff1a; ak∗c≡b(mod1<<k)a k * c \equiv b (mod\ 1 << k)ak∗c≡b(mod 1<<k) 等价&#xff1a; x∗c−y∗(1<<k)b−ax * c - y * (1 << k) b - ax∗c−y∗(1<<k)b−a 用扩展欧…

[Python逆向] 逆向Pyinstaller打包的exe文件源码及保护

Python逆向Pyinstaller打包的exe文件源码及保护 写在前面 我们都知道可以使用Pyinstaller库可将.py文件编译成.exe文件运行&#xff0c;这篇文章我们就从将脚本编译成.exe并将.exe的源码内容反编译出源文件&#xff0c;再顺便谈谈如何防止被逆向。 环境工具 Python 3.6&#x…

(一)MicroPython——WIFI点灯

目录 学习目标 成果展示 硬件知识 代码 总结 学习目标 成果展示 预备知识 代码 总结 学习目标 我们今天来学习有关MicroPython的知识点&#xff0c;相比于用C语言来开发&#xff0c;MicroPython有许多的优点&#xff0c;比如可以交互&#xff0c;有大量的库可以调…

Allegro如何把快速BUS组高亮成不同颜色操作指导

Allegro如何把快速BUS组高亮成不同颜色操作指导 在做PCB设计的时候,会需要把BUS组高亮成不同颜色,方便评估与布线,Allegro支持快速把BUS高亮成不同的颜色,如下图 具体操作如下 打开颜色管理器出现颜色管理器

1576_AURIX_TC275_MTU控制与状态寄存器

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 在这一页之前&#xff0c;连续有好几个寄存器都是预留的&#xff0c;因此可以直接跳过。访问使能寄存器的功能&#xff0c;从描述看其实是非常熟悉的&#xff0c;因为这个描述的模板可以从…

Java多线程:线程通信:生产者 和 消费者 || 顺序打印

Java多线程&#xff1a;线程通信&#xff1a;生产者 和 消费者 || 顺序打印 每博一文案 靠谱&#xff0c;是最高级的聪明&#xff1a;师父说&#xff1a;人生一回&#xff0c;道义一场。你对人对事的态度&#xff0c;藏着你一生的福报。 千金难买好人缘&#xff0c;人活的就是…