【问题标题】:C++ changing multi-Dimension Array to one-D array by memory addressC ++通过内存地址将多维数组更改为一维数组
【发布时间】:2018-04-14 06:57:20
【问题描述】:

我在 C++ 书中读到, “虽然 C++ 可以让我们对多维数组进行建模,但数组所在的内存是一维的。所以编译器将多维数组映射到内存空间中,内存空间只扩展一个方向。”

我想,如果我想将 n 维数组更改为 1 维数组(按升序排列),为什么我只需调用 n 维数组内存地址(以 1 维格式存储)并放入新的一维数组??

(通常我用for语句将n-d数组变为1-d数组)

有可能吗??如果可能的话,提供简单的示例代码将不胜感激。

【问题讨论】:

标签: c++ arrays memory


【解决方案1】:

指向数组中第一项的指针也是指向被视为一维数组的完整数组的指针。项目在内存中连续存储的保证来自sizeof 要求,n 个项目的数组的大小是项目大小的 n 倍,当项目本身是一个数组时也是如此。

【讨论】:

  • 简单地说例如是否符合语言要求? static int arr3d[3][4][5]; int *p = (int *)arr3d; for(int i=0; i<3*4*5; i++) p[i] = i; ?
  • @PeterA.Schneider:形式上并非没有很多支持性的论据,并不是每个人都会被说服,因为你有一个reinterpret_cast。这种演员阵容完全没有必要。你可以做&arr3d[0][0][0]
  • 我明白你在说什么。然后例如,如果有 Arr2d[2][2] 那么 Arr2d 的地址与 Arr2d[0][0] 的地址相同,所以我应该通过 Arr2d[0][ 的指针递增来输入 Arr1d[4] 0]。我说的对吗?
  • @TaeHyeongKim:我认为你是对的,当 s/should/can/ ;)。
  • @Alf 好吧,我对演员阵容很有信心。如果人们只是为了获取地址而取消引用,我也会感到困扰;-)(相当于写p = &(***arr3d);)——如果有什么我会写p = arr3d[0][0];...
【解决方案2】:

是的,可以将n维数组转换为一维数组。

让我以二维数组为例:

for (i = 0; i < n; i++)
{
    for (j = 0; j < m; j++)
    {
        b[i * n + j] = a[i][j];
    }
}

【讨论】:

  • 我不认为这是 OP 期望的方式。
  • 你能澄清一下吗,这是我从问题中理解的。
  • 我和你一样完成了工作,但我只想使用内存地址进行更改。计算机在内存空间中存储像一维数组一样的n-d数组,我想通过引用直接调用地址来使用它,并直接放入我新宣布的一维数组
  • 查看我对 Alf's answer 的评论以获取代码示例。
  • @AbhishekKeshri OP 说他/她经常使用 for ,所以他/她只想第一个元素的地址 ,我想.所以我认为如果不使用for语句,我认为没有真正的意义converting
猜你喜欢
  • 2018-06-25
  • 1970-01-01
  • 2020-10-15
  • 2019-01-15
  • 1970-01-01
  • 2023-03-26
  • 2019-06-29
  • 1970-01-01
相关资源
最近更新 更多