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

时间:2013-09-21 04:37:43

标签: c++ pointers matrix 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是左下角,{{1}是右下角。

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

我理解我在这里与连续记忆的想法相矛盾,因为我正在采用一个4个元素的数组(M的第i行)并存在内存中并试图打破这个序列通过将该数组的最后2个元素指向2个元素的不同数组。但是,如果我可以侥幸逃脱,那么当矩阵变大时,它将节省时间,因为我不想采用深度复制B到M元素的方式。我也意识到我可能在这里滥用“深层复制”......

为了澄清,我希望(基本上)将不是第一个元素的数组B[BlockIndex][i]的元素的地址更改为不同数组X的(第一个元素)。在此操作之后,当您迭代Y,Z的元素时,您将访问不同的顺序内存集X

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

谢谢,

X...Y...Z

1 个答案:

答案 0 :(得分:2)

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

另外,你不能“改变”数组的地址,它是一个常数。但是,您可以使用指针数组,但在您的情况下,它也无法使用。唯一的选择是复制数组的内容。

可能有一些非标准的vector类允许你这样做,但是你对数组的访问会很慢。

我认为只是复制一切不应该是性能问题太多。最有可能的是,生成初始块(或读取它们)将主导复制时间。欢呼声。