C语言初学者笔记【结构体】

文章目录

  • 一、结构体的使用
    • 1. 结构体声明
    • 2. 变量创建与初始化
    • 3. 特殊声明与陷阱
  • 二、内存对齐
    • 1. 规则:
    • 2. 示例分析:
    • 3. 修改默认对齐数:
  • 三、结构体传参
  • 四、结构体实现位段
    • 1. 定义
    • 2. 内存分配
    • 3. 应用场景
    • 4. 跨平台问题:
    • 5. 注意事项:
  • 关键总结

一、结构体的使用

1. 结构体声明

struct Stu {        // struct 关键字 + 标签(tag)char name[20];  // 成员变量int age;        // 成员类型可不同char sex[5];char id[20];
};                  // 分号不可省略

2. 变量创建与初始化

// 顺序初始化
struct Stu s1 = {"张三", 20, "男", "20230818001"};// 指定成员初始化(C99+)
struct Stu s2 = {.age=18, .name="lisi", .id="20230818002", .sex="女"};

3. 特殊声明与陷阱

· 匿名结构体(只能使用一次):

struct { int a; char b; } x;  // 无标签
struct { int a; char b; } *p;
p = &x;  // 错误!编译器认为两者类型不同

· 自引用正确方式:

struct Node {         // 错误:struct Node next;(无限递归)int data;struct Node* next; // 正确:使用指针
};

· typedef 陷阱:

typedef struct {      // 错误:内部提前使用Nodeint data;Node* next;      // ❌ 未定义
} Node;// 正确写法
typedef struct Node {int data;struct Node* next;
} Node;

二、内存对齐

1. 规则:

· 首成员偏移量 = 0
· 其他成员对齐数 = min(编译器默认对齐数, 成员大小)
· VS默认对齐数 = 8,Linux gcc无默认值(对齐数=成员大小)
· 结构体总大小 = 最大对齐数的整数倍
· 嵌套结构体:嵌套的结构体成员对齐到自身内部最大对齐数的整数倍处,结构体的整体大小是所有元素中最大对齐数的整数倍

2. 示例分析:

struct S1 { char c1; int i; char c2; }; // 大小=12 (1+3填充+4+1+3填充)
struct S2 { char c1; char c2; int i; }; // 大小=8  (1+1+2填充+4)

节省空间技巧:将小成员集中放置(对比S1 vs S2)

3. 修改默认对齐数:

#pragma pack(1)      // 对齐数设为1(无填充)
struct S { char c1; int i; char c2; }; // 大小=6
#pragma pack()       // 恢复默认对齐数

三、结构体传参

· 传地址优于传结构体:

void print(struct S* ps) {  // ✅ 推荐:传递指针(4/8字节)printf("%d\n", ps->num);
}
void print(struct S s) {    // ❌ 避免:大结构体拷贝开销大printf("%d\n", s.num);
}

原因:传值导致拷贝开销,降低性能。


四、结构体实现位段

1. 定义

:二进制位(比特位)

struct A {             // 位段声明int _a:2;         // 占2比特int _b:5;         // 占5比特int _c:10;        // 占10比特int _d:30;        // 占30比特(不能超过自身大小,即<=32)
};                    // 总大小:8字节(2个int)

· 成员主要为整形

2. 内存分配

· 空间按需以4字节(int)或1字节(char)开辟
· 给定空间后,成员在字节内的分配顺序由编译器决定(从左向右/从右向左)
· 当剩余空间不够存储一个成员时,剩余空间是浪费与否也取决于编译器

3. 应用场景

. 如_a中只需要存储0、1、2、3数字,则_a只需要两个比特位的空间,避免空间的浪费
· 网络协议头(如IP数据报):
| 4位版本号 | 4位首部长度 | 8位服务类型 | 16位总长度 | ...
用位段精简存储(如4位版本号仅需半字节)


4. 跨平台问题:

· int位段符号不确定(signed/unsigned)
· 最大位数依赖机器(16位机最大16,32位机最大32)
· 剩余位处理方式不确定(舍弃或利用)

5. 注意事项:

struct A sa;
scanf("%d", &sa._b);  // ❌ 错误:位段成员无独立地址
// 正确做法:
int b;
scanf("%d", &b);
sa._b = b;

关键总结

主题 要点
结构体声明 分号不可省;避免匿名结构体自引用
内存对齐 掌握4条规则;通过成员排序节省空间;#pragma pack修改对齐数
传参方式 首选传地址(避免拷贝开销)
位段 节省空间但不可移植;成员无地址;慎用于跨平台程序
应用场景 协议封装、硬件寄存器映射等空间敏感场景

注:位段内存分配示例(假设小端存储):

struct S { char a:3; char b:4; char c:5; char d:4; };
struct S s = {0};
s.a = 10; // 二进制: 010 (存储低3位)
s.b = 12; // 二进制: 1100 (存储后续4位)
// 内存布局: | 1100 010 | ???? ??? | ... |

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

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

相关文章

基于XGBoost算法的数据回归预测 极限梯度提升算法 XGBoost

一、作品详细简介 1.1附件文件夹程序代码截图 全部完整源代码&#xff0c;请在个人首页置顶文章查看&#xff1a; 学行库小秘_CSDN博客​编辑https://blog.csdn.net/weixin_47760707?spm1000.2115.3001.5343 1.2各文件夹说明 1.2.1 main.m主函数文件 该MATLAB 代码实现了…

数据安全系列4:常用的对称算法浅析

常用的算法介绍 常用的算法JAVA实现 jce及其它开源包介绍、对比 传送门 数据安全系列1&#xff1a;开篇 数据安全系列2&#xff1a;单向散列函数概念 数据安全系列3&#xff1a;密码技术概述 时代有浪潮&#xff0c;就有退去的时候 在我的博客文章里面&#xff0c;其中…

云计算学习100天-第26天

地址重写地址重写语法——关于Nginx服务器的地址重写&#xff0c;主要用到的配置参数是rewrite 语法格式&#xff1a; rewrite regex replacement flag rewrite 旧地址 新地址 [选项]地址重写步骤&#xff1a;#修改配置文件(访问a.html重定向到b.html) cd /usr/local/ngin…

【Python办公】字符分割拼接工具(GUI工具)

目录 专栏导读 项目简介 功能特性 🔧 核心功能 1. 字符分割功能 2. 字符拼接功能 🎨 界面特性 现代化设计 用户体验优化 技术实现 开发环境 核心代码结构 关键技术点 使用指南 安装步骤 完整代码 字符分割操作 字符拼接操作 应用场景 数据处理 文本编辑 开发辅助 项目优势 …

Windows 命令行:dir 命令

专栏导航 上一篇&#xff1a;Windows 命令行&#xff1a;Exit 命令 回到目录 下一篇&#xff1a;MFC 第一章概述 本节前言 学习本节知识&#xff0c;需要你首先懂得如何打开一个命令行界面&#xff0c;也就是命令提示符界面。链接如下。 参考课节&#xff1a;Windows 命令…

软考高级--系统架构设计师--案例分析真题解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言试题一 软件架构设计一、2019年 案例分析二、2020年 案例分析三、2021年 案例分析四、2022年 案例分析试题二 软件系统设计一、2019年 案例分析二、2020年 案例分…

css中的性能优化之content-visibility: auto

content-visibility: auto的核心机制是让浏览器智能跳过屏幕外元素的渲染工作&#xff0c;包括布局和绘制&#xff0c;直到它们接近视口时才渲染。这与虚拟滚动等传统方案相比优势明显&#xff0c;只需要一行CSS就能实现近似效果。值得注意的是必须配合contain-intrinsic-size属…

通过uniapp将vite vue3项目打包为android系统的.apk包,并实现可自动升级功能

打包vue项目,注意vite.config.ts文件和路由文件设置 vite.config.ts,将base等配置改为./ import {fileURLToPath, URL } from node:urlimport {defineConfig } from vite import vue from @vitejs/plugin-vue import AutoImport from unplugin-auto-import/vite import Com…

经营帮租赁经营板块:解锁资产运营新生态,赋能企业增长新引擎

在商业浪潮奔涌向前的当下&#xff0c;企业资产运营与租赁管理的模式不断迭代&#xff0c;“经营帮” 以其租赁经营板块为支点&#xff0c;构建起涵盖多元业务场景、适配不同需求的生态体系&#xff0c;成为众多企业破局资产低效困局、挖掘增长新动能的关键助力。本文将深度拆解…

C语言---编译的最小单位---令牌(Token)

文章目录C语言中令牌几类令牌是编译器理解源代码的最小功能单元&#xff0c;是编译过程的第一步。C语言中令牌几类 1、关键字&#xff1a; 具有固定含义的保留字&#xff0c;如 int, if, for, while, return 等。 2、标识符&#xff1a; 由程序员定义的名称&#xff0c;用于变…

机器学习 | Python中进行特征重要性分析的9个常用方法

在Python中,特征重要性分析是机器学习模型解释和特征选择的关键步骤。以下是9种常用方法及其实现示例: 1. 基于树的模型内置特征重要性 原理:树模型(如随机森林、XGBoost)根据特征分裂时的纯度提升(基尼不纯度/信息增益)计算重要性。 from sklearn.ensemble import Ra…

心路历程-了解网络相关知识

在做这个题材的时候&#xff0c;考虑的一个点就是&#xff1a;自己的最初的想法&#xff1b;可是技术是不断更新的&#xff1b; 以前的材料会落后&#xff0c;但是万变不能变其中&#xff1b;所以呈现出来的知识点也相对比较老旧&#xff0c;为什么呢&#xff1f; 因为最新的素…

CAT1+mqtt

文章目录 MQTT知识点mqtt数据固定报头可变报头(连接请求)有效载荷 阿里云MQTT测试订阅Topic下发数据给MQTT.fxMQTT.fx 发布消息给服务器 下载mqtt(C-嵌入式版)我的W5500项目路径使用Cat1连接阿里云平台AT指令串口连接1. 开机联网2. 激活内置SIM卡(贴片卡)3. 我这里使用连接的是…

AiPPT怎么样?好用吗?

AiPPT怎么样&#xff1f;好用吗&#xff1f;AiPPT 是一款智能高效的PPT生成工具&#xff0c;通过AI技术快速将主题或文档&#xff08;如Word/PDF&#xff09;转化为专业PPT&#xff0c;提供超10万套行业模板&#xff0c;覆盖商务、教育等22场景&#xff0c;支持一键生成大纲、文…

恶补DSP:2.F28335的定时器系统

一、定时器原理F28335 城市的三座时钟塔&#xff08;Timer0、Timer1、Timer2&#xff09;是城市时间管理的核心设施&#xff0c;每座均为32位精度&#xff0c;依靠城市能源脉冲&#xff08;系统时钟 SYSCLKOUT&#xff0c;典型频率为150 MHz&#xff09;驱动。它们由两个核心模…

用倒计时软件为考研备考精准导航 复习 模拟考试 日期倒计时都可以用

考研&#xff0c;是一场与时间的博弈。从决定报名的那一刻起&#xff0c;日历上的每一个数字都被赋予了特殊意义 —— 报名截止日、现场确认期、初试倒计时、成绩查询点…… 这些节点如同航标&#xff0c;指引着备考者的方向。而在这场漫长的征途里&#xff0c;一款精准、易用的…

React学习(七)

目录&#xff1a;1.react-进阶-antd-搜索2.react-进阶-antd-依赖项说明 3.react-进阶-antd-删除1.react-进阶-antd-搜索我们jsx代码里只能返回一个最顶层的根元素下拉框简化写法&#xff1a;把这个对象结构赋值一下&#xff1a;清空定义个参数类型做修改事件需要定义三个…

Unix Domain Socket(UDS)和 TCP/IP(使用 127.0.0.1)进程间通信(IPC)的比较

Unix Domain Socket&#xff08;UDS&#xff09;和 TCP/IP&#xff08;使用 127.0.0.1 或 localhost&#xff09;都是进程间通信&#xff08;IPC&#xff09;的方式&#xff0c;但它们在实现、性能和适用场景上有显著区别。以下是两者的对比&#xff1a;1. 通信机制Unix Domain…

SQL中对时间操作的函数

以下是SQL中常用时间操作函数的汇总&#xff0c;按功能分类整理&#xff0c;结合多个权威来源内容综合而成&#xff1a; 一、获取当前时间 函数名称功能说明示例适用数据库CURDATE()获取当前日期&#xff08;不含时间&#xff09;SELECT CURDATE(); → 2024-08-21MySQL, Mari…

NUS PC5215 Lecture分析 Week1 Python基础

NUS PC5215 Lecture分析 Week1 Python基础前言Python基础数据类型保留字表达式Import 相关库IEEE浮点数前言 课程网站 作为一名计算机本科毕业的学生&#xff0c;该课程有点类似于本科期间学的数值分析的进化版&#xff0c;大抵是教会你如何实现各种方法&#xff0c;诸如蒙特卡…