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

深入理解 C++ 中的指针与自增表达式:*a++、(*a)++ 和 *++a 的区别解析

一、运算符优先级与结合性

首先,运算符优先级决定了表达式的解析方式:

  • 后缀自增 a++ 的优先级高于解引用 *

  • 前缀自增 ++a 的优先级也高于解引用 *

  • 括号 () 拥有最高优先级,可以改变默认运算顺序

基于此:

  • *a++ 等价于 *(a++)

  • (*a)++ 等价于 对 *a 的值做后缀自增

  • *++a 等价于 *(++a) 

二、逐个拆解分析

2.1 *a++ —— 指针先用后自增

含义:
  • 指针 a 当前指向一个地址

  • 解引用 *a 得到该地址的值

  • 后缀自增 a++ 先使用当前指针值,然后指针向后移动一格

执行顺序:
  1. a 当前值(指向 arr[0]

  2. 解引用得到 arr[0] 的值:10

  3. a 自增,指向 arr[1]

代码示例:
int arr[] = {10, 20, 30};
int* a = arr;  // 指针 a 指向数组首元素 arr[0]std::cout << *a++ << std::endl;  // 输出 10
std::cout << *a << std::endl;    // 输出 20,说明 a 指向下一个元素了

2.2  (*a)++ —— 值先用后自增,指针不变

含义:
  • *a 访问当前指针指向的值

  • 对该值进行后缀自增(值加一)

  • 指针本身不发生变化

执行顺序:
  1. *a 当前值(例如 20

  2. 输出该值

  3. 将该值加一存回内存(即 arr[1] 变成 21

代码示例:
int arr[] = {10, 20, 30};
int* a = arr;  // 指针 a 指向数组首元素 arr[0]std::cout << (*a)++ << std::endl; // 输出 10
std::cout << *a << std::endl;     // 输出 11,值被修改了

2.3  *++a —— 指针先自增再解引用

含义:
  • 前缀自增:指针 a 先向后移动一格

  • 解引用新位置的值

执行顺序:
  1. 指针 a 自增,指向 arr[2]

  2. 解引用 *a,得到 30

代码示例:
int arr[] = {10, 20, 30};
int* a = arr;  // 指针 a 指向数组首元素 arr[0]std::cout << *++a << std::endl; // 输出 20
std::cout << *a << std::endl;   // a 现在指向 arr[2]

三、总结和源码

表达式含义指针移动访问的值值是否变化
*a++先取当前指针指向的值,再指针后移指针后移当前指针指向的值
(*a)++当前指针指向的值后缀自增指针不变当前指针指向的值是,值 +1
*++a指针先前缀自增,再取新地址值指针前移新指针指向的值

完整示例代码

        注意!连续执行和分开执行如果不重置指针指向结果也会不一样,上文是分开执行的,下面是连续执行的结果:

#include <iostream>int main() {int arr[] = {10, 20, 30};int* a = arr;std::cout << "*a++: " << *a++ << std::endl;  // 输出 10,a 指向 arr[1]std::cout << "*a after *a++: " << *a << std::endl; // 输出 20std::cout << "(*a)++: " << (*a)++ << std::endl;    // 输出 20,arr[1] 变成 21std::cout << "*a after (*a)++: " << *a << std::endl; // 输出 21std::cout << "*++a: " << *++a << std::endl;  // a 指向 arr[2],输出 30std::cout << "*a after *++a: " << *a << std::endl; // 输出 30return 0;
}
http://www.lryc.cn/news/595310.html

相关文章:

  • 破除扫描边界Photoneo MotionCam-3D Color 解锁动态世界新维度
  • 京东疯狂投资具身智能:众擎机器人+千寻智能+逐际动力 | AI早报
  • 2021 RoboCom 世界机器人开发者大赛-本科组(复赛)解题报告 | 珂学家
  • [硬件电路-64]:模拟器件 -二极管在稳压电路中的应用
  • 物流链上的智慧觉醒:Deepoc具身智能如何重塑搬运机器人的“空间思维”
  • 库卡气体保护焊机器人省气的方法
  • Java IO流体系详解:字节流、字符流与NIO/BIO对比及文件拷贝实践
  • 大模型高效适配:软提示调优 Prompt Tuning
  • 【Windows】多标签显示文件夹
  • PLC之间跨区域通讯!无线通讯方案全解析
  • SQL通用增删改查
  • Spring Cache 扩展:Redis 批量操作优化方案与 BatchCache 自定义实现
  • C++中的deque容器
  • vue3实现可视化大屏布局
  • 相机标定(非ROS相机)
  • hard_err错误
  • 【PTA数据结构 | C语言版】哥尼斯堡的“七桥问题”
  • 2000 兆瓦挖矿合作落地,GSP 2031 携 Whitebird 拓展全球合规算力版图
  • 【安全篇 / 反病毒】(7.6) ❀ 01. 查杀HTTPS加密网站病毒 ❀ FortiGate 防火墙
  • 服务器设置国外IP无法访问对防御攻击有用吗?
  • uni-api交互反馈组件(showToast)的用法
  • 处理excel/wps表格中数值格式的警告的工具和脚本
  • Nacos中feign.FeignException$BadGateway: [502 Bad Gateway]
  • kafka 生产消息和消费消息 kafka-console-producer.sh kafka-console-consumer.sh
  • A316-HF-DAC-V1:专业USB HiFi音频解码器评估板技术解析
  • 用window字体替换zabbix 默认的字体
  • 招聘公务员问题
  • ISPDiffuser文章翻译理解
  • 数据库占用内存过高?
  • Windows防火墙配置详解