如何为指针分配二维数组?

时间:2016-03-18 10:09:46

标签: c++ arrays pointers

我想为指针分配一个数组,以便我可以使用它

int arrayA[2][2] = {{1,2},{3,4}};
int arrayB[3][1] = {{1},{2},{3}};
int** arrayC;
if(case1)
   arrayC = arrayA;
if(case2)
   arrayC = arrayB;
//work with arrayC

我该怎么办?

编辑:找到另一个解决方案。见答案

3 个答案:

答案 0 :(得分:2)

int **是一种根本不同的数据类型,因此与2D数组int [][]不兼容。

在上面的示例中,您尝试执行此类操作的唯一简单方法是将2D数组展平为1D数组:

int arrayA[2 * 2] = { 1, 2, 3, 4 };
int arrayB[3 * 1] = { 1, 2, 3 };
int* arrayC;
if (case1)
   arrayC = arrayA;
if (case2)
   arrayC = arrayB;

显然,您需要自己进行显式数组索引计算。

答案 1 :(得分:1)

您无法将2D数组指定(正确的术语转换为指针指针)。原因是1D数组到指针(到第一个元素)的转换不适用于更高的维度。

你可以做的是声明一个指向两个int数组的指针。这种情况下的转换是有效的。

readonly

要意识到的是,int arrayA[2][2] = {{1,2},{3,4}}; int (*arrayB)[2]; arrayB = arrayA; *arrayB的第一个元素的地址。在此示例中,该元素是使用arrayA初始化的数组。

编辑原始问题后添加以下内容以询问其他问题。

以上确实需要维度的一致性,因此在尺寸不匹配的(现在已编辑的示例)中不起作用。这是需要匹配的最后一个(最右边)维度。

如果您想要维度不匹配,除了将数组展平为单个维度之外,没有其他解决方案。

答案 2 :(得分:0)

我找到了一个动态初始化阵列的解决方案:

int arrayA[2][2] = { { 1, 2 }, { 3, 4 } };
int arrayB[3][1] = { { 1 }, { 2 }, { 3 } };
int** arrayC;
int dimension1, dimension2;
if (case1)
{
    dimension1=2;
    dimension2=2;
    arrayC = new int*[dimension1];
    for (int i = 0; i < dimension1; i++)
        arrayC[i] = arrayA[i];
}
if (case2)
{
    dimension1=3;
    dimension2=1;       
    arrayC = new int*[dimension1];
    for (int i = 0; i < dimension1; i++)
        arrayC[i] = arrayB[i];
}
//work with arrayC
for (int i=0; i<dimension1; i++)
   arrayC=null;
delete[] arrayC;