目录
- 关于++和*的优先级问题
- 进一步理解*(p++)和*(++p)
关于++和*的优先级问题
首先明确一点
解引用*的优先级比自增++低
区分如下代码:
1.*p++:等价于*(p++) 先对指针p解引用 再把指针p+1(不会对野指针进行解引用操作)
2.*++p:等价于*(++p) 先把指针p+1 再对指针p解引用(可能对野指针解引用 会报错)
3.++*p:等价于++(*p) 先把指针p解引用 再把解引用的结果++
4.(*p)++:先对p解引用 拿到指针p指向的变量(假设int a = 10; int *p = &a) *p拿到a 然后再++ 相当于把a++ a最终变为11
所以++*p等价于(*p)++等价于++(*p)
这里的等价是说能达到的效果 放在表达式里还是要考虑前置++和后置++的 如下图
开始钻牛角尖:既然++的优先级高 那么++*p也应该先算++p啊 正常人的理解都是对的 细想反而想不通了
下面的介绍都是在钻牛角尖 可以不看 没什么太大意义 把最后那俩例题搞懂就ok
类比一下 数学里 减- 的优先级比 乘x 低
++*p类比成:×-p 就是按顺序算下去 就是乘上一个-p 相当于×(-p) 所以++是作用于*p的
优先级高并不意味着“先执行” 而是"先结合"
有了以上认识 下面的代码就很显然了
进一步理解*(p++)和*(++p)
也许会有疑问:*(p++)和*(++p)看上去毫无区别啊 都加上小括号了 那p不肯定得先++?
其实区别就在于前置++和后置++
*(p++):
*(++p):
*(p++)和*(++p) 确实++的优先级高 p都是先跟++结合的
优先级高 只能说p和++先结合起来 不代表p就直接要++了!!
p和++结合完 再一看:
发现是前置的 那就先把p++ p++后的结果再给解引用*使用
发现是后置的 那就先把p给解引用*使用 使用完再对p++(容易成为野指针)
这就是为什么下图*(p++) 没有报错说非法访问
因为后置++ 先使用 再++ 先使用的就是当前p的地址 也就是num的地址 肯定不会越界
像下图这样前置++的特点是先++ 再使用
先++p就不指向num了 指向下一个非法的地址 成野指针了
再对野指针解引用 肯定报错