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



我正在通过实现Conway的生命游戏来尝试C。

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

起初,我绝望地试图定义指向网格的指针,比如int * grid,你不能用第二组括号(比如[][])给它加下标,因为很明显,第一组括号返回一个int

我也尝试过类似int * grid[HEIGHT][WIDTH]的东西,但这会给将这样的一个指针分配给另一个指针带来问题。(事实上,我不知道这在记忆中到底起到了什么作用!)

在我天真的希望中,我认为在偶然发现双分球后,以下几项可能会奏效。程序会编译,但在指定的行上运行时会失败。(在Windows中,除了问题事件名称为APPCRASH之外,我没有得到更多详细信息)。

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

#include <stdio.h>
#include <stdlib.h>
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;
}

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

您可以定义一种类型:

typedef int MyArray[20][20];

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

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

但是,这假设您有一个常数,在编译时已知的高度和宽度。如果它必须是动态的,那么无论如何都要使用指针表方法中的索引。但请记住,查找到的实际指针必须在最后一分钟加载,从而导致管道暂停和潜在的缓存未命中。这比通过[row*20+col]自己计算要贵100倍。

因此,你应该问自己的真正问题是"它需要快速运行,还是我希望代码看起来‘整洁’?">

中介绍了一种常见的方法http://c-faq.com/aryptr/dynmuldimary.html

您可以按照我的方式使用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;

最新更新