C/C++ 指针运算优先级全解


C/C++ 指针运算优先级全解(终极详解校正版)


一、C/C++ 运算符优先级权威完整表(精选指针相关)

优先级运算符说明结合性
1() [] -> .函数调用、数组下标、结构体成员/指针成员左到右
2++ --后缀自增/自减(如 p++左到右
3++ -- + - ! ~ * & sizeof前缀自增/自减,正负,逻辑/按位非,解引用,取地址,大小右到左
4(type)强制类型转换右到左
5* / %乘除模左到右
6+ -加减左到右
7<< >>移位左到右
8< <= > >=大小比较左到右
9== !=相等比较左到右
14= += -= *= /=赋值类右到左

指针相关特别说明:

  • 单目 * 是解引用(优先级高),双目 * 是乘法(优先级低)。
  • [].-> 优先级最高,用于数组、结构体成员、指针成员访问。
  • 自增/自减分前缀(优先级高)和后缀(最高)。

二、指针组合表达式拆解(全解)

1. *p++

  • 等价:*(p++)
  • 解析:先用 p 指向内容,再让 p 自增(指针移动到下一个元素)

2. *++p

  • 等价:*(++p)
  • 解析:p 先自增,再解引用(即访问下一个元素的内容)

3. (*p)++

  • 等价:(*p)++
  • 解析:先解引用,内容自增(即指针指向的值自增)

4. *p[3]

  • 等价:*(p[3])
  • 解析:p[3]表示第3个元素的指针,解引用其内容

5. (*p)[3]

  • 等价:(*p)[3]
  • 解析:p是指向数组的指针,先解引用得到数组,再取第3项

6. *p->x

  • 等价:*(p->x)
  • 解析:先通过->访问成员,再解引用该成员指针

7. (*p).x

  • 等价:(*p).x
  • 解析:p指向结构体,解引用后访问成员

8. *(p + 1)

  • 等价:*(p + 1)
  • 解析:p加1(指向下一个元素),再解引用它

9. *(&a + 1)

  • 等价:*(&a + 1)
  • 解析:取a地址,加1后解引用(指向下一个同类型变量的内容)

10. *p++ + *q--

  • 等价:*(p++) + *(q--)
  • 解析:各自解引用、各自自增/自减,再求和

三、易错点与括号校正(全面警示)

  1. 自增/自减与解引用混用

    • *p++(*p)++
      • *p++:指针自增,内容不变
      • (*p)++:内容自增,指针不变
  2. 数组下标与解引用

    • *p[2](*p)[2]
      • *p[2]p[2]先取第2个指针再解引用
      • (*p)[2]p指向数组,取第2项
  3. 成员与解引用

    • *p->x(*p).x
      • *p->x:先成员访问,再解引用
      • (*p).x:先解引用,再成员访问
  4. 多级指针与数组混用

    • **p + 1:先解引用两次,再加1
    • *p + 1:解引用后加1(指针指向的内容加1)
    • *(p + 1):指针加1后解引用
  5. 取地址与加法

    • *(&a + 1):取地址加1,解引用(注意越界风险)

四、速查口诀 + 实践建议

速查口诀

“成员数组最优先,后缀自增紧跟前,单目算术再赋值,遇复杂必加括!”

  • 成员和数组运算符优先级最高
  • 后缀自增自减优先于前缀
  • 单目(解引用、取地址)再到算术
  • 赋值优先级最低
  • 复杂组合一律加括号

实践建议

  • 所有多重运算表达式都加括号,优先保证可读性和无歧义
  • 团队代码规范建议:指针运算强制加括号
  • 养成用 IDE 或工具辅助检查的习惯

五、最全实例对比表

表达式等价加括号说明
*p++*(p++)指针自增
*++p*(++p)指针先自增
(*p)++(*p)++指针内容自增
*p[3]*(p[3])第3个指针指向内容
(*p)[3](*p)[3]指向数组第3项
*p->x*(p->x)指向成员内容
(*p).x(*p).x指向结构体,访问成员
*(&a + 1)*(&a + 1)地址加1后的内容
*(p + 1)*(p + 1)指针加1后解引用
**p**p二级指针解引用
*p + 1(*p) + 1指针指向内容加1
*(p++) = *(q++)*(p++) = *(q++)两边解引用赋值后各自自增

六、图解:指针运算符优先级树(Mermaid)

表达式
后缀运算符
前缀运算符 ++ -- * &
算术运算符 + - * 除
赋值运算符 =

后缀运算符: [] -> . ++ – ()

七、权威标准参考


八、结论与建议

  • 指针相关运算符优先级极易混淆,必须用括号明确表达式含义
  • 运算符优先级顺序:成员/数组 > 后缀自增 > 前缀单目 > 算术 > 赋值
  • 所有复杂表达式强烈建议加括号,减少歧义与 bug,提升代码安全性与可维护性

总结

遇到指针运算多重组合时,宁可多加括号,也不要相信自己的记忆力和运算符优先级表。让代码表达清晰易懂,远离隐晦 bug!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北漂老男人

防秃基金【靠你的打赏续命】

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值