指向2d数组的指针

我有一个关于指向2d数组的指针的问题。 如果一个数组是类似的

int a[2][3]; 

那么,这是一个指针数组a

 int (*p)[3] = a; 

如果这是正确的,我想知道[3]int(*p)[3]什么意思?

而不是把int[2][3]作为一个“2d数组”,你应该把它看作是一个“数组数组”。 它是一个有两个项目的数组,其中每个项目本身就是一个有3个整数的数组。

 int (*p)[3] = a; 

您可以使用p来指向a中的两个项目之一。 p指向一个三int数组 – 即第一个这样的项目。 p+1会指向第二个3-int数组。 要初始化p指向第二个元素,请使用:

 int (*p)[3] = &(a[1]); 

以下是指向两项中第一项的等效方法。

 int (*p)[3] = a; // as before int (*p)[3] = &(a[0]); 
 int a[2][3]; 

a被读为int数组3的数组2,它只是一个数组数组。 当你写的时候,

int (*p)[3] = a;

它将p声明为指向数组的第一个元素的指针。 所以, p指向3个数组,它是数组数组的一个元素。

考虑这个例子:

  int a[2][3] +----+----+----+----+----+----+ | | | | | | | +----+----+----+----+----+----+ \_____________/ | | | p int (*p)[3] 

这里, p是你的指针,它指向3个整数的数组,它是数组数组的一个元素。

严格来说,不, int (*p)[3] = a; 不是一个指针。 它是一个指向第一个元素的指针。 a的第一个元素是一个三个整数的数组。 p是一个指向三个整数的指针。

一个指向数组a指针将被声明如下:

 int (*q)[2][3] = &a; 

pq的数值很可能(甚至可能被要求)是相同的,但它们是不同的types。 当你在pq上进行算术运算时,这将起作用。 p+1指向数组a的第二个元素,而q+1指向数组a之后的内存。

记住: cdecl是你的朋友: int a[2][3]int (*q)[2][3]

[3]是types的一部分。 在这种情况下, p是指向保存整数的大小为3的数组的指针。

数组的特定types总是包含它的大小,所以你的types为int *[3]或者int *[5] ,而不是只有int *[] ,这个types的大小没有定义。

 int *x[20]; /* type of x is int *[20], not just int *[] */ int y[10][10]; /* type of y is int[10][10], not just int[][] */ 

另请注意: –

int * p [5] // p是一个由5个指针组成的数组

int(* p)[5] // p指向一个5个整数的数组

int(*(p + 5))[10] // p是指向结构的第5个元素有10个整数的结构的指针。