如题所述
你这个代码除非pa是二维数组指针或二级指针(比如int (*)[]类型或int **),否则如果是一级指针(比如int*)这代码就是错误的。
pa为指针,这里小括号优先,先将pa指向的地址+1(后面的pa表示最初地址+1)。
原式子变为++*pa[1],这里中括号优先,所以原式子相当于++*(pa[1])。
进一步原式相当于++(*(pa[1]))。
显然这里pa如果是一级指针,那么pa[1]就是一个值,*pa对值取值就错了。
所以假设pa指向一个二维数组int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}这个式子pa初始指向第一行。
所以pa+1后,就是指向第二行。
所以(pa+1)[1],就是取从第二行开始的二维数组({{4,5,6},{7,8,9}})的第2航行元素,也就是{7,8,9}这样的一维数组。
所以前面*取的就是{7,8,9}的首元素值,再算++,就是对首元素的值自增。
所以这个代码,pa是指向二维数组的指针,那么式子就是对第三行首元素值自增。
下面我们可写代码测试:
#include <stdio.h>
int main()
{
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int (*pa)[3]=a;
printf("式子执行前a[2][0]=%d\n",a[2][0]);
(++*(pa+1)[1]);
printf("式子执行后a[2][0]=%d\n",a[2][0]);
return 0;
}
不是的。
"[]"优先于"*",所以++*(pa+1)[1] 就是++*((pa+1)[1])而(pa+1)[1]就是 *(pa+1+1)就是pa[2],总体就是++*(pa[2]), 下标方式就是++pa[2][0]
很直观了: ++*(pa+1)[1]的含义是第二行第0列的值+1
验证一下: