根据问题描述,需要先理清++运算符的功能:
++运算符是+1的运算,但对于指针来说,就是p=p+1,这个时候p所指向的地址发生了1个偏移,并不会保留原来的地址指向。
++运算符有前置和后置两种使用方式,前置是先++后取值,后置是先取值后++。
针对上述问题描述,截图是在一条语句中多次使用++运算符,但是正常的方式是当所有的判断结束后,指针偏移一个地址,但是条件语句中,对指针p进行了多次地址偏移,所以会造成越界的问题。
最简单的做法是在判断的开始直接将*(p+1)的内容进行缓存,如 char tmp = *(p+1),这样不会多次重复使用*操作符。
引入一数组s[ ][ ],令p=s
p+1是数组s的第1行的首地址
*(p+1)则是数组s第1行第1列的元素的地址
*(p+1)+1则是数组s第1行的第1列的地址
*(*(p+1)+1)是取*(p+1)+1即s[1][1]所指向变量的值
++都包含了p=p+1这么个操作,也就是本来只想取p后面一个字符,现在两次p++就取到后面的后面了
sum=*(p+1)=='V' || *(p+1)=='X') ? sum-1:sum+1;
这句中如果改为*(p++), 当解析到第一个*(p++)时, p的指向已经向后移动一个位置, 当解析到第二个*(p++)时, p的指向根本不和第一个一致, 逻辑上就是错误的