C中的2D数组如何成为1D数组?

Man*_*ete 5 c c++ pointers

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

假设我声明了一个静态2D数组

float buffer[NX][NY];
Run Code Online (Sandbox Code Playgroud)

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果缓冲区是一个二维数组,一旦传递给initarray函数,如何将其用作一维数组呢?我很难理解它......

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

Ale*_*ler 7

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

A1 A2 A3 A4 B1 B2 B3 B4 C1 C2 C3 C4
Run Code Online (Sandbox Code Playgroud)

由于底层存储是连续的,人们可以简单地将数组转换为指向第一个元素的指针,并使用单个偏移量访问所有元素(这种'cast',在这样的上下文中称为'decaying',在buffer传递时自动发生to initarray).

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