如何将二维数组分配给**指针? [复制]

Posted

技术标签:

【中文标题】如何将二维数组分配给**指针? [复制]【英文标题】:how to assign two dimensional array to **pointer ? [duplicate] 【发布时间】:2012-04-15 20:07:55 【问题描述】:

如何将二维数组分配给**指针? 这就是我想要做的想法

int arrray [2][3];
int **pointer = array;
so pointer[0][1]= 1;

所以有什么帮助吗? 在此先感谢

【问题讨论】:

【参考方案1】:

像这样声明指针:

int (*pointer)[3] = array;

但这在 C++ 中非常讨厌。如果您解释了您的一般目的是什么,也许您可​​以找到更好的解决方案(涉及向量之类的解决方案)。

【讨论】:

同意。 STL 会省去很多麻烦。 这不是我想要的,这是一维数组谢谢你的努力 @AhmedZainElDein:您想要的无法实现,这是一种提供与您想要兼容的source内容的方法。 @user1308378 :这按您的要求执行-它是一个指向一维数组的未定义数字的指针pointer[n][i];是有效的. 我同意这确实有效。尽管我在 C++ 中声称 infinitely nasty 是一个很大的主张,但可能言过其实。有时我们必须支持最初用 C 编写的遗留代码,并且没有足够的时间来完全切换它。如果我声称它是讨厌,但绝对讨厌 ;)【参考方案2】:

简单的答案是你不能。二维数组是保存每一行的连续内存块,而指向指针的指针可以引用指向包含整数的不同内存位置的指针所在的内存位置。

另一方面,您可以创建一个单独的数据结构,以您想要的方式保存指向元素的指针(即创建一个指针数组,将这些指针初始化为每行的开头,并使用指向该元素的指针pointer) 的指针数组,但它根本没有用,反而会使一切变得不必要地复杂化。

这个问题可能来自于普遍的误解,即数组和指针是相同的,但事实并非如此。数组可以衰减为指向数组第一个元素的指针(并且会经常这样做),但该指针的类型是第一个元素的类型。在二维数组中,第一个元素的类型是内部数组,而不是基本元素类型。

【讨论】:

好的,非常感谢你,我知道数组本身是一个指针,例如 arr[2] 可以像 *arr *(arr+1)= 3 一样处理它我该怎么做东西,但有二维数组? arr[3][2] ,我可以说 **arr = 0 等等...... @AhmedZainElDein:不,你错了,这是一个常见的误解。数组不是指向第一个元素的指针,即使存在从数组到指向第一个元素的指针的隐式转换,它们也是完全不同的类型。一旦您真正了解它们不是相同的东西,就会更容易理解为什么您所要求的无法完成。另一种看待它的方法是绘制二维数组(大小为 N*M 元素的单个块)的内存布局,然后意识到该块内没有指针,因此您无法创建指向它的指针 感谢您的启发。我更倾向于你所说的,因为我根本无法找到对 arr[3][2] 的 **arr 引用,但这让我问另一个问题,它在一维数组中的工作原理是 int arr[2 ] ,我可以说 *arr = 0 ; *(arr+1)= 3 @AhmedZainElDein:给定一个类型为 T 且名称为 array 的数组,用作 rvalue-expression 的表达式 array 被转换(通常称为衰减)为指向第一个元素的指针。也就是说,array 被翻译成&array[0],它的类型是T*。现在,在二维数组中,对于给定类型 U 和大小 N,T 是 U [N],这意味着在 int array[3][3]; 中,array 衰减为 &array[0],其类型为 int (*)[3]。结果表达式不再是一个数组,而是一个指针,不能进一步衰减。 ... 与表达式*array 进行比较,其中array 将衰减为&array[0] 产生*&array[0],其类型为array of 3 int因此将自己衰减到第一个元素的地址:&(*&array[0])[0],相当于&array[0][0]。这可能令人困惑,但重要的是,当数组用作 rvalue-expression 时,它将被转换为等效指针,但仅在这种情况下,转换后的指针不再是一个数组,不能再次转换...

以上是关于如何将二维数组分配给**指针? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将 int[][] 分配给 int** [重复]

如何利用memcpy将二维指针复制给一维指针?

如何将一个二维数组中的内容复制到另一个二维数组

如何将 PHP 数组分配给 jQuery 数组? [复制]

二维数组是双指针吗? [复制]

二维数组是双指针吗? [复制]