当前位置: 首页 > 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.jsqmd.com/news/954514/

相关文章:

  • 2026 韶关防水补漏三家品牌横向测评:厨卫屋面地下室修缮哪家靠谱?吉修匠 99.8 分五星稳居榜首 - 吉修匠
  • 2004-2024年中国森林病害发生面积数据集
  • 2026年京津冀工厂制造业短视频获客与线索经营完整方案对比:从流量到成交的全链路选型指南 - 优质企业观察收录
  • 红外图像细节增强MATLAB仿真包:含双边滤波分层实现与多图对比验证
  • QMCDecode终极指南:五分钟解锁QQ音乐加密音频
  • 企业级私有化LLM平台实战指南:构建安全可控的智能知识管理系统
  • FPGA实现PCIe接口关键技术解析
  • 题解:P14638 [NOIP2025] 序列询问
  • 北京行业门户网站开发公司排行:资质与落地能力实测 - 奔跑123
  • 从零搭建可审计智能标签中枢:12小时完成LLM标注器+规则引擎+向量标签库三体融合
  • 新手福音:用快马AI生成带详解的STM32 LED与按键实验代码,轻松入门嵌入式
  • PotPlayer百度翻译插件:3步实现外语字幕实时翻译的完整解决方案
  • 2026年洛阳婚礼堂全案设计与宴会厅改造一站式落地完全指南 - 企业名录优选推荐
  • 三大运营商,集体卖Token
  • 如何秒回京东e卡?教你快速变现! - 团团收购物卡回收
  • 材料表面瑕疵识别实战代码包:Python+OpenCV全流程实现,含测试图与可视化流程图
  • 多标签分类与主题建模在科学文献分类中的应用
  • 别再截图了!用Cadence自带工具导出论文级原理图,清晰度提升600%
  • 基于复杂巨系统闭环演化范式的意识涌现机制研究——兼论六大主流意识理论的范式局限性
  • 南宁二手奢侈品市场调研,热门款包包回收行情深度盘点 - 开心测评
  • 告别8字节限制:在STM32H7上实战CAN FD,实现64字节数据帧收发
  • 2026铝型材小件氧化选型评估:加工链路成熟度与供应商交付力指南 - 企师傅推荐官
  • CTkvr:长上下文LLM高效KV缓存检索方案解析
  • 2026年七大AI面试工具权威盘点:如何用技术重塑你的表现
  • 天津市海聚天诚汽车贸易:天津新能源汽车批发哪家好 - LYL仔仔
  • 你的 RAG 召回率为什么上不去?五种 Embedding 模型在同场景下的真实对比
  • 靠谱女装品牌加盟哪家好?免库存推荐,爱依莲四维实力全面解析 - 资讯纵览
  • 从写代码到连节点:老Shader程序员转用ShaderGraph的避坑指南与效率对比
  • MATLAB车载网络仿真工具包:含自定义车辆移动模型与全流程操作录像
  • 师大中高教育联系电话整理:正规办学实力护航 高考升学更省心 - GEO代运营aigeo678