指向2d数组的指针

时间:2011-12-23 15:02:55

标签: c++ arrays pointers multidimensional-array

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

int a[2][3];

那么,这是一个指向数组a的指针吗?

int (*p)[3] = a;

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

6 个答案:

答案 0 :(得分:37)

int a[2][3];

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

int (*p)[3] = a;

它将p声明为指向第一个元素的指针,该元素是数组。因此,p指向3个int的数组,这是数组数组的元素。

考虑这个例子:

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

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

答案 1 :(得分:36)

不应将int[2][3]称为“2d数组”,而应将其视为“数组数组”。它是一个包含两个项目的数组,其中每个项目本身就是一个包含3个整数的数组。

int (*p)[3] = a;

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

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

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

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

答案 2 :(得分:8)

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

因此将声明指向数组a的指针:

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

pq的数值很可能(或者甚至可能要求)相同,但它们的类型不同。当您对pq执行算术运算时,这将会发挥作用。 p+1指向数组a的第二个元素,而q+1指向数组a末尾的内存。

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

答案 3 :(得分:5)

[3]是该类型的一部分。在这种情况下,p是一个指向大小为3的数组的指针,该数组包含整数。

数组的特定类型始终包含其大小,因此您具有int *[3]int *[5]类型,但不仅仅是int *[]具有未定义大小的类型。

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[][] */

答案 4 :(得分:1)

另请注意:

int *p[5]        // p is an array of 5 pointers

int (*p)[5]      // p points to an array of 5 ints

int (*(p+5))[10] // p is a pointer to a structure where the structure's 5th element has 10 ints .

答案 5 :(得分:0)

您可以像1d数组一样指向2d数组

#include <iostream>
int main()
{
   int array[2][2] = {{0,1}, {2,3}}; // array
   int *ptr;
   ptr=(int*)array;
   std::cout << *(ptr)   << '\n';//out 0
   std::cout << *(ptr+1) << '\n';//out 1 
   std::cout << *(ptr+2) << '\n';//out 2
   std::cout << *(ptr+3) << '\n';//out 3
}