指向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个整数的结构的指针。