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

顺时针/螺旋规则 | 彻底弄懂复杂C/C++嵌套声明 const常量声明

文章目录

  • 顺时针/螺旋规则 | 彻底弄懂复杂C/C++嵌套声明 const常量声明
    • 一、核心思想
    • 二、详细步骤(七步法)
    • 三、ASCII 图详细解析
      • 示例1:简单数组指针 `char *str[10];`
      • 示例2:函数指针 `char *(*fp)(int, float *);`
      • 示例3:复杂嵌套 `void (*signal(int, void (*fp)(int)))(int);`
    • 四、完整解析表格
      • 通用解析流程表
      • 修饰符位置影响表
    • 五、实际应用练习
      • 练习1:解析 `int (*(*func)(int))[5];`
      • 练习2:解析 `void (*(*(*fp1)())[10])();`
    • 六、记忆口诀
    • 七、常见陷阱提醒

顺时针/螺旋规则 | 彻底弄懂复杂C/C++嵌套声明 const常量声明

一、核心思想

从内向外,螺旋解析:从要理解的标识符(变量名、函数名)开始,按照顺时针螺旋方向逐步向外解析声明的含义。

二、详细步骤(七步法)

第1步:找到目标标识符 示例:解析 "str" 在 "char *str[10];" 中 第2步:检查是否在括号内 - 如果在括号内,先解析括号内的内容 - 如果不在,直接开始螺旋移动 第3步:向右移动 查看右边的符号: - 如果遇到 [size] → "大小为size的数组" - 如果遇到 () → "函数,参数为..." - 如果遇到 , → 继续向右直到遇到结束符号 第4步:向下/继续向右 继续按顺时针方向移动,处理遇到的符号 第5步:向左移动 查看左边的符号: - 如果遇到 * → "指针" - 如果遇到 const → "常量" - 如果遇到 volatile → "易变的" 第6步:向上移动 查看类型说明符(如 int、char、void 等) 第7步:组合所有部分 将解析出的各部分组合成完整描述

三、ASCII 图详细解析

示例1:简单数组指针char *str[10];

ASCII 解析图: +----------------------------------+ | 步骤 | 方向 | 符号 | 含义 | +------+------+------+--------------+ | 1 | 起点 | str | 开始位置 | | 2 | → | [10] | 数组,10个元素| | 3 | ↘ | * | 指针 | | 4 | ← | char | 指向char类型 | +----------------------------------+ 视觉螺旋路径: +-------+ | +-+ | | ^ | | char *str[10]; ^ ^ | | | +---+ | +-----------+ 解析过程: 1. str → 向右 → [10] → "str是10个元素的数组" 2. 继续螺旋 → * → "数组的每个元素是指针" 3. 继续螺旋 → char → "指针指向char" 最终:str是10个元素的数组,每个元素是指向char的指针

示例2:函数指针char *(*fp)(int, float *);

ASCII 解析图: +---------------------------------------------+ | 步骤 | 方向 | 符号 | 含义 | +------+------+------------+------------------+ | 1 | 起点 | fp | 开始位置 | | 2 | ← | ( | 进入括号 | | 3 | ← | * | 指针 | | 4 | → | ) | 离开括号 | | 5 | → | (int,...) | 函数,参数为... | | 6 | ↘ | * | 返回指针 | | 7 | ← | char | 指向char | +---------------------------------------------+ 视觉螺旋路径: +--------------------+ | +---+ | | |+-+| | | |^ || | char *(*fp)( int, float *); ^ ^ ^ || | | | +--+| | | +-----+ | +------------------------+ 详细解析: 1. fp → 向右被)阻挡,所以先看括号内 2. fp在括号内 → 向左 → * → "fp是指针" 3. 离开括号 → 向右 → (int, float *) → "指向函数,接收int和float*参数" 4. 继续螺旋 → * → "函数返回指针" 5. 继续螺旋 → char → "指针指向char" 最终:fp是指针,指向接收int和float*参数并返回char*的函数

示例3:复杂嵌套void (*signal(int, void (*fp)(int)))(int);

ASCII 解析图: +---------------------------------------------------+ | 步骤 | 目标 | 方向 | 解析 | +------+-------+------+-----------------------------+ | 1 | signal| → | (int, ...) → 函数,两个参数 | | 2 | fp | ← | * → 指针 | | 3 | fp | → | (int) → 函数,接收int | | 4 | fp | ← | void → 返回void | | 5 | signal| → | ) → 离开参数列表 | | 6 | signal| ← | * → 返回指针 | | 7 | signal| → | (int) → 指向函数,接收int | | 8 | signal| ← | void → 返回void | +---------------------------------------------------+ 视觉螺旋路径: +-----------------------------+ | +---+ | | +---+ |+-+| | | ^ | |^ || | void (*signal(int, void (*fp)(int)))(int); ^ ^ | ^ ^ || | | +------+ | +--+| | | +--------+ | +----------------------------------+ 分步解析: Part 1: 解析fp(作为signal的第二个参数) 1. fp → 在括号内 → * → "指针" 2. → (int) → "指向接收int参数的函数" 3. ← void → "函数返回void" 结果:fp是指针,指向接收int返回void的函数 Part 2: 解析signal 1. signal → 向右 → (int, void (*fp)(int)) → "函数,接收int和函数指针参数" 2. 继续 → 离开参数列表 → 遇到* → "返回指针" 3. 继续 → (int) → "指向接收int参数的函数" 4. 继续 ← void → "函数返回void" 结果:signal是接收int和函数指针,返回函数指针的函数 最终:signal是函数,接收int和函数指针,返回指向接收int返回void的函数的指针

四、完整解析表格

通用解析流程表

+-----------+-----------+----------------+-----------------------------------+ | 步骤序号 | 移动方向 | 遇到的符号 | 对应的英文描述 | +-----------+-----------+----------------+-----------------------------------+ | 1 | 起点 | identifier | "[identifier] is..." | | 2 | 右 | [size] | "array of size..." | | 3 | 右 | [] | "array of undefined size..." | | 4 | 右 | (params) | "function taking params..." | | 5 | 左 | * | "pointer to..." | | 6 | 左 | const | "constant..." | | 7 | 左 | volatile | "volatile..." | | 8 | 终点 | type | "...type" | +-----------+-----------+----------------+-----------------------------------+

修饰符位置影响表

+-------------------------+----------------------+-----------------------------------+ | 声明 | 解析顺序 | 中文描述 | +-------------------------+----------------------+-----------------------------------+ | const char *p; | p → * → char → const | p是指向const char的指针 | | char * const p; | p → const → * → char | p是const指针,指向char | | const char * const p; | p → const → * → const char | p是const指针,指向const char | | volatile int * const *p | p → * → const → * → volatile int | p是指针,指向const指针,指向volatile int | +-------------------------+----------------------+-----------------------------------+

五、实际应用练习

练习1:解析int (*(*func)(int))[5];

解析步骤: 1. func → 在括号内 → * → "指针" 2. → (int) → "指向接收int参数的函数" 3. → * → "函数返回指针" 4. → [5] → "指向5个元素的数组" 5. ← int → "数组元素是int" ASCII图: int (*(*func)(int))[5]; ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | | +-----+ | | | | +------------+ | | +----------------+ +--------------------+ 最终:func是指针,指向接收int参数并返回指向5个int元素数组的指针的函数

练习2:解析void (*(*(*fp1)())[10])();

解析步骤: 1. fp1 → 在括号内 → * → "指针" 2. → () → "指向无参数函数" 3. → * → "函数返回指针" 4. → [10] → "指向10个元素的数组" 5. → * → "数组元素是指针" 6. → () → "指向无参数函数" 7. ← void → "函数返回void" 最终:fp1是指针,指向返回指针的函数,该指针指向10个元素的数组,数组元素是指向返回void的无参数函数的指针

六、记忆口诀

看声明,有技巧,螺旋规则要记牢: 从名开始向右瞧,遇到括号先处理; 数组函数向右找,指针修饰向左扫; 螺旋一圈类型到,从内向外描述好; const volatile位置妙,左看右看要分晓。

七、常见陷阱提醒

  1. 括号优先级最高:总是先处理最内层的括号
  2. 向右有限制:遇到右括号或分号就转向
  3. const位置关键
    • const*左边 → 修饰指向的内容
    • const*右边 → 修饰指针本身
  4. 函数与数组不直接兼容:函数返回的不能是数组,但可以是指向数组的指针

掌握了这个规则,你就能像编译器一样解析任何C语言声明了!

http://www.jsqmd.com/news/155255/

相关文章:

  • 基础-事务
  • YOLO目标检测中的上下文信息利用:提升复杂场景表现
  • YOLO与JWT令牌验证:确保每次调用的身份合法性
  • 进阶-存储引擎
  • YOLO与Redis缓存集成:加速高频请求的响应时间
  • YOLO模型请求队列管理:避免资源争抢的排队机制
  • C++进程间通信:从管道到零拷贝共享内存的性能进化
  • 大模型自主化部署与集成实施方案——大模型本地部署流程
  • 深度学习--CUDA安装配置、pytorch库、torchvision库、torchaudio库安装
  • 为什么大模型时代,提示词是你必须掌握的“魔法咒语“?
  • YOLO模型版本迭代路线图:未来发展方向预测
  • 30节大模型全栈课程:从理论到实战+500+论文,助你成为AI时代高薪工程师7_【保姆级教程】大模型从入门到实战
  • 解决电脑主机更新系统后前面板3.5mm没声音
  • YOLO目标检测中的运动模糊补偿:提升动态场景鲁棒性
  • YOLO与InfluxDB时序数据库对接:记录历史性能数据
  • YOLO模型自动扩缩容设计:基于负载的GPU资源调度
  • YOLO与Flask/Django集成:构建Web端检测服务的路径
  • YOLO与gRPC协议集成:构建高性能内部通信链路
  • YOLO模型蒸馏技术探索:用小模型逼近大模型精度
  • for-each与常规for循环的效率区别
  • YOLO与CI/CD流水线整合:自动化测试与部署实践
  • AI时代的突击:像许三多一样,修好你心里的那条路
  • YOLO模型训练硬件选型建议:GPU型号对比与推荐
  • YOLO模型远程调试技巧:通过SSH连接GPU服务器
  • YOLO模型标签平滑技术:缓解过拟合的有效手段
  • YOLO模型灰度发布策略:确保线上服务稳定过渡
  • 第十次作业
  • YOLO模型冷热数据分离:长期存储与即时访问的平衡
  • YOLO在智慧农业中的尝试:作物识别与病虫害预警
  • YOLO与Grafana仪表盘联动:可视化展示系统运行指标