如果有人可以向我解释以下行为,我将不胜感激:
假设我声明一个静态二维数组
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 是一个 2D 数组,那么一旦传递给它,如何将其用作 1D 数组initarray
功能?我很难理解它......
当二维数组静态分配时,分配的内存是连续的,但是如果以下情况可以使用这种方式:buffer
是动态分配的吗?
具有 3 x 4 元素(即矩阵)的 2D 数组在内存中看起来像这样:
A1 A2 A3 A4 B1 B2 B3 B4 C1 C2 C3 C4
由于底层存储是连续的,因此可以简单地将数组转换为指向第一个元素的指针,并使用单个偏移量访问所有元素(这种“转换”,在这种情况下称为“衰减”,在以下情况下自动发生)buffer
被传递给initarray
).
(在此示例中,编译器将翻译一个表达式,例如buffer[n][m]
to buffer + n*NY+m
基本上,2D 数组只是存储在 1D 数组中的 2D 数据的一种方便的表示法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)