通过C中的函数编辑2D数组

时间:2014-01-04 00:57:11

标签: c arrays pointers multidimensional-array

我有这个功能:     void foo(char tab [8] [8])

我希望这个函数能够编辑制表符数组的值,所以我尝试了这些语法:

void foo( char *(*tab)[8][8] )
void foo( char *(tab)[8][8] )
void foo( char **tab )

还有很多其他人。编译时我总是失败,就像这样:     错误:无法转换' char()[8] [8]' to' char (*)[8] [8]'争论' 1' (...)

所以,我的问题是:如何创建并向函数传递指向2D数组的指针?

感谢。

2 个答案:

答案 0 :(得分:2)

这一次尝试将您的函数声明为

void foo( char (*tab)[8] );  

并将其命名为

foo(point);  

请注意,在这种情况下,您需要传递数组名称,因为它在传递给函数时会衰减到指针(有一些例外)。衰变后,它的类型为char (*)[8]

您也可以通过声明

来实现
void foo( char (*tab)[8][8] ); 

并将其命名为

foo(&point); 

在这种情况下,请注意我传递了&poinnt,即整个数组char (*)[8][8]的地址。
样本:

void foo(char (*tab)[8][8])
{    
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 68j++)
        {
              scanf("%d", &(*tab)[i][j]);
        }
    }
}

答案 1 :(得分:1)

使用数组,您始终可以修改函数中的数据,因为传递的是指针(当然,在没有const限定符的情况下)。也就是说,你可以写:

void foo(char tab[8][8])
{
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
            tab[i][j] = (x + y) % 2 : 'X' : 'O';
    }
}

并称之为:

void calling_func(void)
{
    char board[8][8];
    foo(board);
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
            putchar(tab[i][j]);
        putchar('\n');
    }
}

如果你写的话,你可以收到你看到的错误信息:

   foo(&board);

将指向数组的指针传递给函数。要实现这一点,您必须将函数重写为:

void foo(char (*tab)[8][8])
{
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
            (*tab)[i][j] = (x + y) % 2 : 'X' : 'O';
    }
}

但是,这很少是编写代码的正确方法。使用第一个替代方案,直到你被迫(这可能不会是今年 - 我不记得必须使用指向阵列的指针,除了回答关于SO的问题,但也许这是一个可怕的经历,我已经忘记了一切。)