指向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;
p
和q
的数值很可能(甚至可能被要求)是相同的,但它们是不同的types。 当你在p
或q
上进行算术运算时,这将起作用。 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个整数的结构的指针。