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--) - 解析:各自解引用、各自自增/自减,再求和
三、易错点与括号校正(全面警示)
-
自增/自减与解引用混用
*p++≠(*p)++*p++:指针自增,内容不变(*p)++:内容自增,指针不变
-
数组下标与解引用
*p[2]≠(*p)[2]*p[2]:p[2]先取第2个指针再解引用(*p)[2]:p指向数组,取第2项
-
成员与解引用
*p->x≠(*p).x*p->x:先成员访问,再解引用(*p).x:先解引用,再成员访问
-
多级指针与数组混用
**p + 1:先解引用两次,再加1*p + 1:解引用后加1(指针指向的内容加1)*(p + 1):指针加1后解引用
-
取地址与加法
*(&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!
980

被折叠的 条评论
为什么被折叠?



