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

时间:2014-02-20 07:19:43

标签: c pointer-to-pointer

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

我正在尝试动态构建两个网格(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;
}

3 个答案:

答案 0 :(得分:2)

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

您可以定义类型:

typedef int MyArray[20][20];

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

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

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

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

答案 1 :(得分:0)

http://c-faq.com/aryptr/dynmuldimary.html

中描述了执行此操作的常用方法

答案 2 :(得分:0)

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