有关C++多维数组指针的问题

下面几个输出都有什么区别呢?傻傻分不清。

#include <stdio.h>
#include<stdlib.h>

using namespace std;

int main(int argc, char* argv[])
{
    int v[2][10] = {
        {1,2,3,4,5,6,7,8,9,10},
        {11,12,13,14,15,16,17,18,19,20}
        };
    int (*a)[10] = v;
    printf("**a = %d\n", **a);
    printf("**(a+1) = %d\n", **(a+1));
    printf("*(*a+1) = %d\n", *(*a+1));
    printf("*(a[0]+1) = %d\n", *(a[0]+1));
    printf("*(a[1]+1) = %d\n", *(a[1]+1));
    printf("*(a[1]) = %d\n", *(a[1]));
    return 0;
}

我们说数组名相当于指向数组第一个元素的指针,这个一位数组的时候应该比较好理解。
理解多维数组也一样,例子中二维数组v[2][10], 该二维数组可以理解为包含两个元素v[0], v[1] , 其每个元素都是一个包含“10个整型元素”的数组,
该二维数组的第一个元素是v[0],是一个包含了“10个整型元素”的数组;
a 对应数组名v, 指向数组第一个元素的指针, 想象指向的范围是第一整行;
a+1 指向数组第二个元素,指向的范围是第二整行;
*a : 对应的是指向第一行第一个元素的指针,指向范围是第一行第一个元素;
**a*a 基础上再取*, 那么就是第一行第一个元素的值1;同理**(a+1)是返回第二行第一个元素的值11;
*a+1 是指向第一行第一个元素的指针加1,那么就是指向第一行第二个元素的指针,*(*a+1)就是第一行第二个元素的值2;
a[0]是指向第一行第一个元素的指针,a[0] +1 就是指向第一行第二个元素的指针,*(a[0]+1) 返回值2;
a[1]是指向第二行第一个元素的指针,*(a[1])返回值11;a[1] +1 是指向第二行第二个元素的指针,*(a[1]+1) 返回值12;

结果:

 **a = 1
**(a+1) = 11
*(*a+1) = 2
*(a[0]+1) = 2
*(a[1]+1) = 12
*(a[1]) = 11

简单点可以试着这么理解:二维数组名指向的是第一行整行(二维数组的第一个元素),加*以后"降"一级,指向的是该行中的第一个元素,再加*,指向内容:值。

  • a&a[0]等价;
  • a[0]&a[0][0]等价;
  • a[0]*a 等价;
  • a[0][0]**a等价;

    不知道有没有讲明白,希望能有帮助。