当前位置: 首页 > 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.dtcms.com/a/290833.html

相关文章:

  • spring入门
  • EMBMS1820芯祥科技18单元电池监控器芯片数据手册
  • MySQL二进制包安装
  • OpenAI Codex CLI与 Google Gemini CLI 比较
  • Match宣布2025曼谷发布会,发布“保本”资管新范式,旨在重塑Web3投资规则
  • 【科研绘图系列】R语言绘制棒棒图和哑铃图
  • neuronxcc包介绍及示例代码
  • IOPaint+CPolar:零公网IP也能搭建专属AI图像编辑平台
  • 【设计模式】迭代器模式 (游标(Cursor)模式)
  • 编程基础:职责分配
  • 14.7 Alpaca格式深度解析:3倍指令准确率提升的LLM微调秘诀
  • 【计算机组成原理】C语言中数据类型表示及转换总结
  • 第19章 AB实验的局限性
  • 完整的 SquareStudio 注册登录功能实现方案:
  • Docker Desktop安装nginx
  • 相机标定(非ROS相机)
  • 数组去重性能优化:为什么Set和Object哈希表的效率最高
  • VRRP技术
  • CSS中用display实现元素的显示/隐藏切换
  • 教育数字化革命:低代码破局与未来展望
  • `@Disabled` 注解未生效的原因分析与解决方案
  • 【PHP安全】免费解密支持:zend52、zend53、zend54好工具
  • 精密深孔偏心检具的制作及光学深孔检测探究 —— 激光频率梳 3D 轮廓检测
  • DevCon 6记录
  • GeoPandas 进行真正的地理空间可视化
  • ssh2-sftp-client 简化 sftp 文件传输的 node库
  • 轮状太空城的科学依据浅谈
  • 渗透测试视角:Web 应用常见漏洞的利用与防御策略
  • Unity-NavMesh详解-其二
  • 牛客周赛 Round 101