C++ 更改数组元素的地址

C++ Change address of array element

本文关键字:地址 数组元素 C++      更新时间:2023-10-16

我正在编写一个函数,将m x m块组合成n x n矩阵。这些块是一个 3d 指针数组B[BlockIndex][BlockRow][BlockColumn],n x n 矩阵是一个 2d 指针数组M[Row][Column]。如果 M 是 4x4,B 是 4 个 2x2 矩阵,则 BlockIndex = 0 是左上角的块,BlockIndex = 1 是右上角的块,BlockIndex = 2 是左下角的块,BlockIndex = 3 是右下角的块。

我只想将 M 的元素指向相应块的行的开头,但我似乎无法(也不知道是否有可能)设置元素[i][j] M 的地址。我可以将M[i]设置为 B[BlockIndex][i]以便(使用 2x2 和 4x4 示例)M 第 i 行的前 2 个元素指向 BlockIndex-th 块的第 i 行,但是如何将 M 第 i 行的第三个元素指向 (BlockIndex+1)-th 块的第 i 行?

我知道我在这里有点与连续内存的想法相矛盾,因为我正在获取一个并排存在于内存中的 4 个元素的数组(M 的第 i 行),并试图通过将该数组的最后 2 个元素指向不同的 2 个元素数组来打破该序列。但是,如果我能侥幸逃脱,那么当矩阵变得巨大时,它将节省时间,因为我不想诉诸将 B 到 M 元素的深度复制。我也意识到我可能在这里滥用了"深拷贝"......

澄清一下,我想(基本上)将数组X中不是第一个元素的元素的地址更改为不同数组Y,Z(第一个元素)的地址。完成此操作后,当您迭代 X 的元素时,您将访问不同的顺序内存集,X...Y...Z

下面是我正在编写的函数的当前化身,用于将矩阵拆分/组合成/从较小的块中组合。

谢谢

提姆

bool    SplitCombineMat(double** &Mat, double*** &Blocks, int const& MatSize,
                                int const& BlockSize, bool const& SplitMatrix)
{
    bool IsOk = true;
    if (SplitMatrix)
        IsOk = PrepareBlocks(Blocks, MatSize, BlockSize);
    if (IsOk)
    {
        //  Set the beginnings (pointers) of the rows of blocks
        //  to the right elements of Mat.
        //  This is a shallow copy.
        int BlockIndex = 0;
        for (int i = 0 ; i <= MatSize - BlockSize ; i += BlockSize)
            for (int j = 0 ; j <= MatSize - BlockSize ; i += BlockSize){
                for (int k = 0 ; k < BlockSize ; k++)
                    if (SplitMatrix)
                        Blocks[BlockIndex][k] = &Mat[k+i][j];
                    else    //  Here want to use pointers as above but can't figure it out...
                            //  Something like -- &Mat[k+i][j] = Blocks[BlockIndex][k];
                        for (int l = 0 ; l < BlockSize ; l++)
                            Mat[k+i][l] = Blocks[BlockIndex][k][l];
                BlockIndex++;
            }
    }
    return IsOk;
}

你想做的事情在C++是不可能的。正如您所说,数组是内存的连续区域,您不能让它从中间的另一个地址继续。

此外,您不能"更改"数组的地址,它是一个常量。但是,您可以使用指针数组,但在您的情况下,它也不起作用。唯一的选择是复制数组的内容。

可能有一些非标准的向量类可以让你这样做,但是你对数组的访问会很慢。

我认为只是复制所有内容对性能来说应该不是太大的问题。最有可能的是,生成初始块(或读取它们)将主导复制时间。干杯。