C - 交替指针

C - alternating Pointers

我一直在努力理解如何使用指针。我在下面的示例中有一个生命游戏更新函数 (updateGrid) 的小草图。这个想法是在 true 和 false 之间更新网格中所有单元格的状态(如您所知)。 但是,我应该使用指针来在网格的 'previous' 和 'new' 状态之间交替。但是我似乎没有弄清楚如何在不复制当前单元格网格的情况下实现交替指针的概念。有什么想法吗?

顺便说一句,我下面的代码目前运行良好。

// ---------- Global Variables ----------

bool cells[MAX_SIZE][MAX_SIZE];
bool cells_next[MAX_SIZE][MAX_SIZE];

bool (*ptr)[MAX_SIZE][MAX_SIZE];
bool (*ptr_next)[MAX_SIZE][MAX_SIZE];

ptr = &cells;
ptr_next = &cells_next;

// ---------- update state ----------

void updateState() {
    for (int row = 0; row < MAX_SIZE; ++row) {
        for (int col = 0; col < MAX_SIZE; ++col) {
            if (((*ptr)[row][col]) == 1) {
                if ((numAliveNeighbors(row, col) < 2)
                || (numAliveNeighbors(row, col) > 3)) {
                    (*ptr_next)[row][col] = 0;
                } else {
                    (*ptr_next)[row][col] = 1;
                }
            } else if (((*ptr)[row][col]) == 0) {
                if (numAliveNeighbors(row, col) == 3) {
                    (*ptr_next)[row][col] = 1;
                } else {
                    (*ptr_next)[row][col] = 0;
                }
            }
        }
    }
    for (int row = 0; row < MAX_SIZE; ++row) {
        for (int col = 0; col < MAX_SIZE; ++col) {
            (*ptr)[row][col] = (*ptr_next)[row][col];
            (*ptr_next)[row][col] = 0;
        }
    }

PS:我的问题解释可能看起来有点颠簸,请不要犹豫,获取更多信息。

非常感谢:)

注意这些备注:

  • 您应该使用指向行的指针而不是指向二维数组的指针。

  • 您可以通过临时变量交换指针

该代码实现了 John Conway 著名的生命游戏世代。 ptr指向当前板,ptr_next指向下一代。 update() 计算应用细胞死亡和出生规则的新板。当新板完全更新后,指针会交换,因此 ptr 现在指向新板。这比将整个板从 cells_next 复制到 cells.

更快

这是修改后的版本:

// ---------- Global Variables ----------

bool cells[MAX_SIZE][MAX_SIZE];
bool cells_next[MAX_SIZE][MAX_SIZE];

bool (*ptr)[MAX_SIZE] = cells;
bool (*ptr_next)[MAX_SIZE] = cells_next;

// ---------- update state ----------

void updateState() {
    for (int row = 0; row < MAX_SIZE; ++row) {
        for (int col = 0; col < MAX_SIZE; ++col) {
            if (ptr[row][col]) {
                if ((numAliveNeighbors(row, col) < 2)
                ||  (numAliveNeighbors(row, col) > 3)) {
                    ptr_next[row][col] = 0;
                } else {
                    ptr_next[row][col] = 1;
                }
            } else {
                if (numAliveNeighbors(row, col) == 3) {
                    ptr_next[row][col] = 1;
                } else {
                    ptr_next[row][col] = 0;
                }
            }
        }
    }
    // swap the pointers
    bool (*tmp)[MAX_SIZE] = ptr;
    ptr = ptr_next;
    ptr_next = tmp;
}

请注意,numAliveNeighbors 可能应该将 ptr 作为参数,而不是通过全局变量隐式地使用。