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

C++ 为什么说二维数组是“指向指针的指针”,c++,arrays,C++,Arrays,假设我们有以下二维数组: int multi[3][3]; 据我所知,我们可以说multi是指向指针的指针,或者——至少——我们可以这样做: int **p_p_int = multi; 问:为什么我们不说multi是指向指向指针的指针,因为multi指向它的第一个元素的地址,它本身指向一个指针,它指向multi[0][0]的地址,它本身指向multi[0][0]的值 这似乎是4个指向这里的对象,我把地址作为指针计算 现在你可能会说,地址不是指针,即使指针可以等于地址,在这种情况下,说二维数

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

int multi[3][3];
据我所知,我们可以说multi是指向指针的指针,或者——至少——我们可以这样做:

int **p_p_int = multi;
问:为什么我们不说multi是指向指向指针的指针,因为multi指向它的第一个元素的地址,它本身指向一个指针,它指向multi[0][0]的地址,它本身指向multi[0][0]的值

这似乎是4个指向这里的对象,我把地址作为指针计算

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


我觉得我在这里有点迷惑自己了:

一个一维数组转换成指针而不是一个指针-例如,你可以重新分配指针,你不能重新分配数组

文字2d数组的存储方式不如下所述

但是,在以下情况下,可以通过指向指针的指针实现2d数组:

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

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

所以总共有两个指针

在伪代码中,在m,n处查找项的步骤如下:

将m添加到array2d以索引该数组。从计算地址读取指针p; 将n添加到p以索引该数组。从计算地址读取整数。 说multi是指向指针的指针是错误的。它是一个二维阵列。 无法将multi转换为**-仅转换为*

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

不要将二维阵列想象为:

int a[3];
int b[3];
int c[3];
int* x[3] = {a, b, c};
因为这根本不是2D阵列的工作方式


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

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

类型为T[][]..n...[]的任何数组的名称将是T*[]..n-1…[]中的一个数组,例如: int-arr[7]十行到int*arr std::fstream arr[2][2]衰变为std::fstream*arr[2] 通过衰减,我们的意思是,一个可以得到T的函数也可以接受T,这是T的衰减类型

您可以使用指针到指针和动态AllCoAction动态创建psuedo二维数组

int** psuedeo2DimArray = new int*[10];
for (auto i=0U;i<10;i++){
     psuedeo2DimArray[i] = new int[10];
}

在所有情况下,multi的类型都是int[2][2],而不是其他类型

指针的作用是指向某物。仅仅因为某个东西既是指针又指向另一个东西,并不意味着它就是指向指针的指针,除非另一个东西是指针

那么让我们来分析一下:

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

这使它成为一个指针

它本身指向一个指针

这使它成为指向指针的指针

指向多[0][0]的地址

否。它包含多[0][0]的地址,但不指向该地址

它本身指向multi[0][0]的值

当然可以。这是一个指针,指针指向值,这是他们的工作。这并不是让它们指向指针,而是让它们指向值

这似乎是4个指向这里的对象,我把地址作为指针计算


当然可以,但其中两个点是相同的点,只算了两次。你说X是一个指针,它包含一个指向某个东西的值,就好像这是两个独立的指针一样。指针的工作就是要有一个指向某个东西的值,这就是它最初成为指针的原因。有两种说法是一样的,X是指针=X包含一个指向某物的类型的值。

int multi[3][3];decayes to int*[3],仅此而已。仅仅因为你能说出来,并不能使它成为真的。@DavidHaim:这句话有什么错,我们可以说multi是指向指针的指针?这是假的,即。related/dupe:2D数组只是数组的数组。定义int multi[3][3]不会创建任何指针对象,只创建一个由3个子数组组成的数组,每个子数组由3个int对象组成。计算名称multi可以为地址提供指针值,但不会创建指针对象。除非要指向int*指针对象,否则不能使用int**指针指向指向int的指针。建议阅读:IT的第6部分适用于C++以及C.,我认为你混淆了int *多[]数组
整数*的整数倍[3][]整数的数组[3]。在这两种情况下,multi[x][y]都是int,但其他一切都不同。第二个实际上是一个文字2d数组。我想所有让人困惑的是我已经将multi作为变量名重用了。我想我已经明确说明了为什么2d数组可以通过指向指针的指针来存储,但这不是内置的2d数组。什么是array2d?multi是一个数组,但它不包含指针。@Tommy:int multi[3][3]是一个2d数组。我不确定你所说的内置2d数组是什么意思,你的回答肯定不清楚。@rici很抱歉,文字2d数组不是这样存储的,但2d数组可以通过指向以下位置的指针来实现:。。。对你来说不够清楚,不值得评论。我不认为这对大多数人来说是有问题的,因为区别于此:我不想讨论文字2d数组的存储方式;但是,你听说指向指针的指针可以用来保存2d数组的原因是,你可以选择如下布局。即使由于句子的结构向后,没有帮助,他们不得不对句子进行两次不必要的分析。multi不能转换为**。@BenjaminLindley:int**multi是一个合法的表达式,但它的值是没有意义的。@BenjaminLindley-感谢您指出这是一个错误的陈述的原因-回答更新。