gpt4 book ai didi

c++ - C中的二维数组如何变成一维数组?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:52:49 25 4
gpt4 key购买 nike

如果有人能向我解释以下行为,我将不胜感激:

假设我声明了一个静态二维数组

float buffer[NX][NY];

现在,如果我想填充这个数组,我注意到可以这样做:

initarray(buffer, NX, NY);

#define INITDATAVAL 0.5

void initarray(void *ptr, int nx, int ny)
{
int i, j;

float *data = (float *) ptr;

for (i=0; i < nx*ny; i++)
{
data[i] = INITDATAVAL;
}
}

我的问题是,如果 buffer 是一个二维数组,那么一旦它被传递给 initarray 函数,它怎么能被用作一维数组呢?我很难理解它......

当二维数组静态分配时,分配的内存是连续的,但如果 buffer 是动态分配的,是否可以使用这种方式?

最佳答案

具有 3 x 4 元素(即矩阵)的二维数组在内存中看起来像这样:

A1 A2 A3 A4 B1 B2 B3 B4 C1 C2 C3 C4

由于底层存储是连续的,因此可以简单地将数组转换为指向第一个元素的指针并使用单个偏移量访问所有元素(这种“强制转换”在这种情况下称为“衰减”,自动发生当 buffer 被传递给 initarray 时)。

(在此示例中,编译器会将诸如 buffer[n][m] 的表达式转换为 buffer + n*NY+m 基本上,二维数组是只是存储在一维数组中的二维数据的一种舒适表示法。

关于c++ - C中的二维数组如何变成一维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9115775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com