如果您有可用的 C99 或 C11 编译器,则可以在数组参数之前将数组的两个维度作为参数传递,如 ThoAppelsin 的 answer 所示。
如果您坚持使用 C89 编译器,那么您必须更加努力——更加努力。到目前为止,最简单的解决方案是在标题中提供#define 维度;然后你可以写:
int function(grid[HEIGHT][WIDTH]) { ... }
int function(grid[][WIDTH]) { ... }
如果您不能这样做,那么您将不得不考虑修改函数中的代码或 main.c 中的数据结构。
修改函数意味着:
int function(int height, int width, int *grid)
{
int i, j;
for (i = 0; i < height; i++)
for (j = 0; j < width; j++)
grid[i*width + j] = 0;
return j;
}
这需要一个普通的指向int 的指针并显式地进行索引计算,而不是简单地编写两个下标。您的主要代码可能有:
int grid[HEIGHT][WIDTH];
i = function(HEIGHT, WIDTH, &grid[0][0]);
另一种方法是在main() 中创建一个二级结构,一组指向指针的指针:
int grid_rows[HEIGHT];
for (i = 0; i < HEIGHT; i++)
grid_row[i] = grid[i];
i = function(HEIGHT, WIDTH, grid_rows);
现在定义是:
int function(int height, int width, int **grid)
{
int i, j;
for (i = 0; i < height; i++)
for (j = 0; j < width; j++)
grid[i][j] = 0;
return j;
}
这以额外的存储和初始化为代价恢复了函数中符号的便利性。