将指针传递给具有已定义大小的3D数组

时间:2015-03-15 19:16:11

标签: c arrays pointers 3d

我正在创建一个简单的游戏,其中我有一个板,我传递给许多函数来改变它的值。现在我这样做:

void play(int board[2][HEIGHT][WIDTH]);

其中HEIGHT和WIDTH均使用define定义。

我应该如何简化它?我在某个地方读到这样简化它并不是一个好方法:void play(int*** board),虽然我传递的内容总是具有完全相同的大小。

3 个答案:

答案 0 :(得分:0)

你可以在一个结构中使用该板,然后使用像这样的结构数组

struct Board {
    int   width;
    int   height;
    int **data;
};

然后你可以编写一个函数来像这样初始化它

Board *new_board(int width, int height)
 {
    struct Board *board;
    int           i;

    board = malloc(sizeof(struct Board));
    if (board == NULL)
        return NULL;
    board->data = malloc(width * sizeof(int *));
    if (board->data == NULL)
     {
        free(board);
        return NULL;
     }
    board->width = width;
    for (i = 0 ; i < width ; i++)
     {
        board->data[i] = malloc(height * sizeof(int));
        if (board->data[i] == NULL)
         {
            while (--i > 0)
                free(board->data[i]);
           free(board->data);
           free(board);

           return NULL;
         }
     }
    board->height = height;

    return board;
 }

然后你可以将struct Board *pointer[2]传递给你想要访问电路板的函数,并像这样初始化数组 1

struct Board *pointer[2];
int           i;

for (i = 0 ; i < sizeof(poitner) / sizeof(pointer[0]) ; ++i)
    pinter[i] = new_board(width, height);
不要忘记您还需要free_board()功能。


1 假设您知道widthheight

答案 1 :(得分:0)

在函数参数中,您可以省略多维数组的第一个维度的长度。因此

void play(int board[2][HEIGHT][WIDTH]); 

相当于

void play(int board[][HEIGHT][WIDTH]);  

您还应该知道编译器更改

void foo(int arr[]);

void foo(int *arr);  

即。 arr实际上是指向传递的数组的第一个元素的指针。请注意,传递的数组元素的类型为int 现在考虑你的情况,传递的数组的元素是int [HEIGHT][WIDTH]类型,即2D数组。因此,board将成为指向int [HEIGHT][WIDTH]类型的2D数组的指针。

void play(int (*board)[HEIGHT][WIDTH]);  

函数调用就像这样

play(board);  
  

我在某处读到,这样简化它并不是一个好方法:void play(int*** board),虽然我传递的内容总是具有完全相同的大小。

是。这是真的。这是因为int ***int (*)[HEIGHT][WIDTH]属于不同类型,这意味着它们不是类型兼容的。

答案 2 :(得分:0)

这样的事情会更简单吗?您还可以在struct中添加其他数据,例如分数,如果您想撤消最后一步。

#include <stdio.h>

#define HEIGHT  8
#define WIDTH   8

typedef struct Btype {
    int board [HEIGHT][WIDTH];
    } btype;

void play(btype *current) {
}    

int main(void) {
    btype history[2] = {0};
    while (1) {
        history[0] = history[1];        // save last state
        play(&history[1]);
    }
    return 0;
}