如何将双指针用于二维矩阵?

我正在通过实施康威的生命游戏来尝试我的手。

我试图动态构建两个网格( int矩阵),一个用于当前,一个用于下一代,所以在确定下一代的外观之后,我只是交换指针。

起初我绝望地尝试定义指向网格的指针,如int * grid ,你不能使用第二组括号下标,如[][]因为 – 显然 – 第一组括号返回一个int。

我也试过像int * grid[HEIGHT][WIDTH] ,但是这给了一个像这样指向另一个指针的问题。 (事实上​​,我不知道这在内存中真正起作用了!)

在我天真的希望中,我认为以下两个指针的绊脚石可以奏效。 程序编译,但在指示的行上运行时失败。 (在Windows中,除了问题事件名称是APPCRASH之外,我没有得到更多细节)。

免责声明:这不是实际的程序,只是问题的概念certificate。

 #include  #include  int HEIGHT = 20; int WIDTH = 20; int ** curr_gen; // Current generation int ** next_gen; // Next generation /* Entry Point main */ int main(int argc, char** argv) { // Allocate memory for the grids curr_gen = malloc(sizeof (int) * WIDTH * HEIGHT); next_gen = malloc(sizeof (int) * WIDTH * HEIGHT); curr_gen[0][0] = 0; //<< PROGRAM FAILS HERE // Release heap resources free(curr_gen); free(next_gen); return 0; } 

您可以简单地分配空间并将指针强制转换为定义col和行大小的类型。 通过[] []查找指针是很昂贵的。 以这种方式构建动态多维数组应该保留给ragid数组.IE:只在必要时才使用它。

您可以定义类型:

 typedef int MyArray[20][20]; 

然后将malloc指针强制转换为您想要的类型:

 MyArray * curr_gen = (MyArray *) malloc(...); 

但是,这假设您有一个常量,在编译时高度和宽度已知。 如果它必须是动态的,那么一定要将索引用于指针表方法。 但请记住,查找的实际指针必须在最后可能的分钟加载,导致Pipeline停顿,以及潜在的缓存未命中。 比通过[row * 20 + col]自己做数学要贵100倍。

所以你应该问自己的真正问题是“它需要快速运行,还是我希望代码看起来’整洁’?”

你可以用我的方式使用int*作为网格的类型。

通过宏定义或函数将2D位置转换为1D:

 #define MATRIX2INDEX(x, y, width) ((x) + (y) * (width)) // `width` is the max of x + 1 :) int Matrix2Index(int x, int y, int width) { return MATRIX2INDEX(x, y, width); } 

通过int* 2D位置访问数据:

 int* grid = (int*)malloc(sizeof(int) * WIDTH * HEIGHT); grid[MATRIX2INDEX(0, 0, WIDTH)] = 0; // here: get the data you want by 2D position free(grid); grid = NULL;