C++ 更改数组元素的地址
C++ Change address of array element
我正在编写一个函数,将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++是不可能的。正如您所说,数组是内存的连续区域,您不能让它从中间的另一个地址继续。
此外,您不能"更改"数组的地址,它是一个常量。但是,您可以使用指针数组,但在您的情况下,它也不起作用。唯一的选择是复制数组的内容。
可能有一些非标准的向量类可以让你这样做,但是你对数组的访问会很慢。
我认为只是复制所有内容对性能来说应该不是太大的问题。最有可能的是,生成初始块(或读取它们)将主导复制时间。干杯。
- 数组元素打印的递归方法
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 为什么使用数组元素查找最大数字的程序不起作用?
- 数组元素更改值?
- 如何访问宏中定义的数组元素
- 将数组元素递增 1
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 存储指向动态数组元素的指针
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 在 std::map 中插入数组元素
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 将特定数组元素的地址传递到函数
- 数组元素值,元素地址和指针增量
- 为什么数组元素长度的地址计算可被 2 的幂整除更有效
- 相邻数组元素地址之间的差异
- C++ 更改数组元素的地址
- 如何获取数组元素的地址
- 指针与数组元素的地址混淆
- 为什么数组元素的地址有时会被误认为是声明
- 数组元素 c++ 的地址