【问题标题】:Edit a 2D array through a function in C通过 C 中的函数编辑二维数组
【发布时间】:2014-01-04 00:57:11
【问题描述】:

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

我想让这个函数编辑标签数组的值,所以我尝试了这些语法:

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

还有很多其他人。我在编译时总是失败,就像这个: 错误:无法将参数 '1' 的 'char ()[8][8]' 转换为 'char (*)[8][8]' (...)

所以,我的问题是:如何创建一个指向二维数组的指针并将其传递给函数?

谢谢。

【问题讨论】:

  • 显示函数调用。
  • 此刻,它看起来像 foo(point);其中点是: char (*point)[8][8] = &originalVar;
  • originalVar 是二维数组吗?
  • 试试“char *”。一个“二维”字符数组就是一个字符序列。不过,将数组维度传递给您的函数可能是个好主意...
  • originalVar 是一个二维数组,声明如下:char originalVar[8][8] = {'a', 'a', (...)

标签: c arrays pointers multidimensional-array


【解决方案1】:

这次尝试将你的函数声明为

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' 的 'char ()[8][8]' 转换为 'char ()[8]' 到 'void foo(char (*)[8](...)
  • @Rogue No. 显然,您没有注意此答案的“并将其称为”部分。
  • point 的类型为 char (*)[8](衰减后)。您应该不会收到任何错误。
  • @hacks s/is/decays into
  • @H2CO3;好的。做到了。
【解决方案2】:

使用数组,您始终可以修改函数中的数据,因为传递的是指针(当然,在没有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 的问题外,我必须使用指向数组的指针,但也许这是一次可怕的经历,我都忘记了)。

【讨论】:

  • @Rogue 请注意,此答案的第一部分与 hacks 的答案基本相同(因为在函数声明中,char tab[8][8] 等同于 char (*tab)[8]),您声称这不起作用...
  • 是的,我后来注意到了这一点,我已经编辑了我的 cmets 以匹配它。
猜你喜欢
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
相关资源
最近更新 更多