为什么说二维数组是“指向指针的指针?”

时间:2016-02-04 17:31:50

标签: c++ arrays

假设我们有以下二维数组:

int multi[3][3];

据我了解,我们可以说multi是“指向指针的指针”,或者 - 至少 - 我们可以做类似跟随的事情:

int **p_p_int = multi;

问题:为什么我们不说multi是“指向指针指针的指针”,因为multi指向其地址第一个元素,它本身指向一个指针,指向multi[0][0]的地址,该地址本身指向multi[0][0]的值。

这似乎是 4 对象(这里我将地址作为指针计算)。

现在你可能会说“但地址不是指针,即使指针可以等于地址”,在这种情况下,说二维数组是“指向指针”的指针似乎也很奇怪,因为它实际上是指向地址指针(指向某个值)的指针。

我觉得自己有人在这里混淆了一下自己:)

4 个答案:

答案 0 :(得分:2)

1d数组转换为指针而不是1 - 例如你可以重新分配一个指针,你不能重新分配一个数组。

文字2d数组不会以下述方式存储。

然而,如果出现以下情况,则可以通过指向指针的指针实现2d数组:

int **array2d是一个指针。它指向一个数组。该数组包含指针。

因为array2d指向一个指针数组,array2d[n]也是一个指针。但它是指向整数数组的指针。

这是两个指针,总计。

在伪代码中,在(m,n)处查找项目的步骤是:

  • 将m添加到array2d以索引该数组。从计算的地址读取指针p;
  • 将n添加到p以索引该数组。从计算地址读取整数。

答案 1 :(得分:2)

指针的工作是指向某事。只是因为某个东西既是指针又指向别的东西并不会使它成为指向指针的指针,除非其他东西是指针。

所以让我们打破这个:

  

多点指向其第一个元素的地址

这使它成为一个指针

  

本身指向一个指针,

这使它成为指针的指针。

  

指向multi [0] [0],

的地址

没有。它包含@Configuration @ApplicationPath("/rest/public") public class RestPublicConfig extends ResourceConfig{ public RestPublicConfig() { register(PingResource.class); } } 的地址,它没有指向它。

  

本身指向multi [0] [0]

的值

嗯,当然。它是一个指针,指针指向值,这是他们的工作。这并没有使它们成为指针的指针,它使它们成为指向值的指针。

  

这似乎是指向的4个对象(这里我将地址作为指针计算)。

当然,但其中两个指点是指向刚刚计算两次的指针。你说 No qualifying bean of type [org.glassfish.jersey.server.ResourceConfig] is defined: expected single matching bean but found 2: restConfig,restPublicConfig 好像那是两个不同的指点。指针的工作是有一个指向某个东西的值,这就是它首先成为指针的原因。这是两种说法相同的方式,“X是一个指针”=“X包含一个指向某事物的值(类型)。”

答案 2 :(得分:1)

multipointer to a pointer是错误的。它是一个2D阵列。 multi无法转换为** - 仅转换为*

pointer to pointer显然会指向一个指针。 multi没有这样做。您将在该位置找到一个整数 - 而不是指针 - 只是因为multi不是指针数组。 multi[n]也可能会转换为*,但转换后的值不会从存储它的地方获取 - 它只是从multi计算得出。

不要想到像以下那样的2D数组:

int a[3];
int b[3];
int c[3];
int* x[3] = {a, b, c};

因为这不是2D数组的工作方式。

从2D数组获得的所有指针值都是计算值 - 而不是存储值。

答案 3 :(得分:0)

我认为这里有两个不相关的东西你正在混淆:

  1. T[][][]...n...[]类型的任何数组的名称衰变为T*[][][]...n-1...[]
    例如:
    int arr [7]沦为int* arr std::fstream arr[2][2]衰变为std::fstream* arr[2]
  2. 通过衰减,我们的意思是,可以获得T的函数也可以接受T' T'T的腐朽类型

    1. 你可以使用指针指向和动态allcoation来动态创建伪二维数组

      int** psuedeo2DimArray = new int*[10];
      for (auto i=0U;i<10;i++){
           psuedeo2DimArray[i] = new int[10];
      }
      
    2. 在所有情况下,multi的类型都是int[2][2],而不是其他内容。