【问题标题】:can we access the array's deeper elements directly if we know the memory address?如果我们知道内存地址,我们可以直接访问数组的深层元素吗?
【发布时间】:2020-11-02 04:10:39
【问题描述】:

在逻辑上,对于一个 3d 数组,我们需要先访问外部数组,然后在每个维度内部工作,然后访问数组的元素。由于物理内存将数组存储为一块内存,而不管其尺寸如何,我们可以使用它的地址直接访问,因为有办法获取内存位置吗?

如果一个多维数组作为一维数组存储在物理内存中,如果我们知道内存地址,我们是否可以直接访问该数组的深层元素?

【问题讨论】:

  • 是c语言
  • 数组是如何定义的?
  • 如果它是一个真正的 3D 数组,那么是的,您所需要的只是能够访问数组中所有元素的起始地址和数组维度。实际上,数组[] 表示法只是一种方便的语法,并转换为相同的内存地址计算。
  • 假设您有一个array[x][y][z],其中xyz 是维度。要从外部二维数组中处理,您可以执行int i = 0, j = x-1; 然后while (i < j) { /* work with array[j][y][z] and array[i][y][z], then i++, j-- */ } 您添加i == j 的特殊情况,并且如果x 是奇数,则仅处理最终的二维数组一次。

标签: arrays c multidimensional-array data-structures memory-management


【解决方案1】:

您当然可以将 3D 数组 int arr[a][b][c] 视为“扁平化”一维数组 int flattened[a * b * c] 并相应地访问其元素。

int arr[3][4][5];

int * flattened = &arr[0][0][0];

元素arr[i][j][k] 将对应于flattened[b * c * i + c * j + k]

array elements are guaranteed to be contiguous in memory以来,它甚至是定义明确的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 2011-05-12
    • 2021-02-02
    相关资源
    最近更新 更多