当前位置: 首页 > news >正文

C/C++ 基础笔记(八)

当日核心知识:结构体定义与声明、结构体变量、内存对齐、结构体指针、结构体成员访问、typedef 别名、位运算基础


一、结构体基础(定义 / 声明 / 变量)

概念

结构体(struct)是自定义复合数据类型,可将不同类型数据封装为整体,描述复杂对象。

特性

  1. 定义格式:

    struct 结构体名 { 成员类型1 成员名1; 成员类型2 成员名2; // 至少1个成员 }; // 末尾必
  2. 命名规则:结构体名、成员名必须是合法标识符

  3. 变量定义:

    • 先定义类型、后定义变量:struct 结构体名 变量名;(C 语言需 struct,C++ 可省略)

    • 定义类型同时定义变量:struct 结构体名 { ... } 变量名;

  4. 内存分配类型本身无内存变量才有内存;变量初始化与否不影响内存分配。

代码示例

// 结构体类型定义 struct Student { char name[20]; int age; float score; }; ​ // 定义结构体变量 struct Student s1; // C语言写法 Student s2; // C++简化写法

二、typedef 结构体别名

概念

typedef给结构体类型起别名,简化变量定义,无需重复写 struct。

特性

  1. 格式typedef struct 结构体名 { ... } 别名;

  2. 用法:直接用别名定义变量,C/C++ 通用

  3. 优势:代码简洁,避免关键字冗余。

代码示例

// 定义别名Stu typedef struct Student { char name[20]; int age; } Stu; ​ // 用别名定义变量 Stu s1;

三、结构体内存对齐

概念

结构体成员按规则分配内存,成员起始地址需对齐到指定边界,提升 CPU 读取效率。

特性

  1. 对齐规则:

    • 成员按定义顺序依次分配。

    • 对齐基准:结构体中最大基本数据类型的字节数(如 int=4,基准为 4)。

    • 每个成员起始地址:必须是自身类型字节数的倍数

    • 结构体总大小:必须是对齐基准的倍数,不足则补空字节(内存填充)。

  2. 示例:

    struct Test { char a; // 1字节,起始地址0 int b; // 4字节,起始地址需是4的倍数→4,中间空3字节 short c; // 2字节,起始地址8 }; // 总大小:12(4×3,基准4)
  3. 目的:CPU 按固定字节块读取内存,对齐可减少读取次数、提升效率

代码示例

#include <iostream> using namespace std; ​ struct Test { char a; int b; short c; }; ​ int main() { cout << sizeof(Test) << endl; // 输出12 return 0; }

四、结构体成员访问

概念

通过.(点运算符)->(箭头运算符)访问结构体成员。

特性

  1. 结构体变量:用.访问,格式变量名.成员名

  2. 结构体指针:用->访问,格式指针名->成员名;等价于(*指针名).成员名

  3. 赋值规则:成员赋值需匹配类型,整体赋值仅同类型结构体变量可直接赋值。

代码示例

struct Student { int age; }; ​ int main() { Student s; Student *p = &s; ​ // 变量访问:. s.age = 18; // 指针访问:-> p->age = 20; // 等价写法 (*p).age = 22; ​ return 0; }

相似概念比较:.vs->

  • .:用于结构体变量,直接访问成员,注意.优先级高于*,用法:(*p).xxx。

  • ->:用于结构体指针,间接访问成员,语法更简洁。


五、结构体指针

概念

指向结构体类型的指针,存储结构体变量地址,用于间接操作结构体。

特性

  1. 定义格式结构体类型 *指针名;

  2. 初始化:指向同类型结构体变量,指针名 = &变量名;

  3. 内存特性:指针占固定字节(4/8 字节),与结构体大小无关。

  4. 用途:函数传参(避免拷贝,节省内存)、动态内存分配。

代码示例

struct Student { int age; }; ​ int main() { Student s = {18}; Student *p = &s; // 指针指向s cout << p->age << endl; // 输出18 return 0; }

六、语法细节(分号规则)

概念

区分结构体、函数、代码块后分号的使用场景。

特性

  1. 必须加分号:

    • 结构体 / 枚举 / 类定义末尾。

    • 变量声明、语句末尾。

  2. 无需加分号:

    • 函数定义末尾(大括号表示作用域)。

    • 代码块(if/for/while)末尾。

代码示例

// 结构体定义:末尾加分号 struct A { int x; }; ​ // 函数定义:末尾不加分号 void fun() {} ​ // 变量声明:加分号 int a;

七、位运算基础

概念

直接操作二进制位,节省内存,用于状态标记、权限控制。

特性

  1. 核心思想:用二进制位表示状态(1 = 启用,0 = 禁用)。

  2. 优势:1 个字节(8 位)可存 8 种状态,比整型更省内存。

  3. 适用场景:状态标记、硬件控制、标志位管理。

代码示例

// 用位表示状态:0000 0001表示状态1 #define FLAG1 1 int status = FLAG1;
http://www.zskr.cn/news/1466132.html

相关文章:

  • 红外图像细节增强MATLAB仿真包:含双边滤波分层实现与多图对比验证
  • 题解:P14638 [NOIP2025] 序列询问
  • QMCDecode终极指南:五分钟解锁QQ音乐加密音频
  • 企业级私有化LLM平台实战指南:构建安全可控的智能知识管理系统
  • 别再截图了!用Cadence自带工具导出论文级原理图,清晰度提升600%
  • 多标签分类与主题建模在科学文献分类中的应用
  • 材料表面瑕疵识别实战代码包:Python+OpenCV全流程实现,含测试图与可视化流程图
  • 2026年洛阳婚礼堂全案设计与宴会厅改造一站式落地完全指南 - 企业名录优选推荐
  • 基于复杂巨系统闭环演化范式的意识涌现机制研究——兼论六大主流意识理论的范式局限性
  • 告别8字节限制:在STM32H7上实战CAN FD,实现64字节数据帧收发
  • 从写代码到连节点:老Shader程序员转用ShaderGraph的避坑指南与效率对比
  • 聚合型AI平台选型指南:五大工程维度深度解析
  • 2026年洛阳婚礼堂全案设计与宴会酒店升级改造深度指南:一站式落地方案对标解析 - 企业名录优选推荐
  • 2026年陕西乳品企业包装服务商选择指南:五大关键维度解析与推荐 - 2026年企业资讯
  • MuleSoft企业级AI编排:LLM生产落地的稳定性与治理实践
  • 如何轻松抓取网页视频?猫抓浏览器扩展的5大实用技巧
  • 2026 石家庄创业经营者一致认可正规财税公司哪家好?石家庄高性价比财税机构推荐:代理记账、公司注册代办权威口碑排名 - 品牌智鉴榜
  • 别再只盯着PS的GPIO了!手把手教你用Vivado配置AXI GPIO软核(附中断配置避坑指南)
  • 神经科学如何重塑AI工程实践:从突触可塑性到类脑计算落地
  • 2026六月依据实时金价测评:广州黄金回收优质门店排名 - 奢侈品交易观察员
  • Python基础:Python命名规范与命名习惯全掌握
  • Poetry 依赖管理实战:从 pip 迁移的工程化升级
  • 武汉名包回收“内幕”:高价靠谱的渠道藏在这里,别再被坑 - 奢侈品交易观察员
  • 大润发购物卡余额别浪费!零钱到账完整操作步骤 - 团团收购物卡回收
  • JetBrains IDE试用期重置终极指南:一键恢复30天免费使用
  • 实战应用,基于快马ai定制wsl环境,快速部署ubuntu下的web开发项目
  • 2026年广州餐饮点餐小程序多少钱 - 凡科杰建云
  • 2026年路径规划API对比:丰图/高德/百度/腾讯哪家强?实测避坑指南
  • 破解传统鼠控痛点:景隆3S智能鼠饵站方法论如何重构虫控效率? - 资讯纵览
  • 告别龟速下载!保姆级教程:Windows 10/11下用迅雷搞定Qt 5.14.2离线安装包