在C语言数组指针中(++*(pa+1)[1])表示第一行的首地址加一吗?

如题所述

你这个代码除非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;

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-03-26

不是的。

"[]"优先于"*",所以++*(pa+1)[1] 就是++*((pa+1)[1])而(pa+1)[1]就是 *(pa+1+1)就是pa[2],总体就是++*(pa[2]),  下标方式就是++pa[2][0]

很直观了: ++*(pa+1)[1]的含义是第二行第0列的值+1

验证一下:

相似回答