关于C指针遍历多维数组的问题

先上代码----->

    int i[2][3] = { {1,2,3}
                  ,{4,5,6} };
    int(*p)[3];
    p = i;
    for (int i = 0; i < 2; i++)
    {

        for (int j = 0; j < 3; j++)
            printf("%d \n",*(*(p+i)+j));
    
    }

我明白把数组拆成了三个一维数组来访问 p+i 代表数组 i[0] i[1] i[2]
可是最后取数值的时候为什么是((p+i)+j) 方式来取 不明白为什么地址是*(p+i)+j
p+i 不一已经是一维数组的地址了么 *(p+i) 取地址的地址是什么意思?
能有人回答下么。

阅读 3.3k
1 个回答

p是一个指向内含3个元素的一维数组的指针,*p就是代表这个一维组,*p[0],*p[1],*p[2]是数组的各个值,等价改成指针的写法:**p,*(*p+1),*(*p+2)。现在你将二维数组的首地址赋值给:p = i; 则:

i[0][0] 等价于 *p[0]
i[1][0] 等价于 *(p+1)[0] 等价于 *(*(p+1))
i[1][1] 等价于 *(p+1)[1] 等价于 *(*(p+1) + 1)

这样的几个推导示范,不知道你能不能理解到。把握住这两点:

  1. *p 存的也是指针(地址),就如同数组名一样

  2. [] 操作等同于 * 操作

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进