C - 将二维数组上的指针传递给函数

时间:2014-07-12 00:20:05

标签: c arrays function pointers parameters

我必须将一个指针传递给一个二维整数数组(实际上是一个生命游戏网格)。此功能无法知道宽度和高度。什么应该是功能原型?我试过了:

int function(int (*grid)[][], int height, int width);

会导致错误:'数组类型的元素类型不完整'
在不知道数组维度的情况下,我无法找出任何其他方法。

(有点解释:网格的宽度和高度是main.c文件中的#define' d,我需要的函数原型是在头文件中,所以它不能#t; t访问此#define ...)

谢谢

2 个答案:

答案 0 :(得分:2)

除非您像我一样使用MS Visual Studio 2013 Express,并且手中有一个符合C99标准的编译器,否则您可以执行以下操作:

int function( int height, int width, int (*grid)[height][width] );

所有您需要的是可变长度数组(VLA)功能,这是半兼容的MSVC所缺乏的。以下是它的示例用法:http://ideone.com/J3y2oi

答案 1 :(得分:1)

如果您有可用的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;
}

这将以额外的存储和初始化为代价恢复功能中的符号方便性。