我有这个功能: 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数组的指针?
感谢。
答案 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的问题,但也许这是一个可怕的经历,我已经忘记了一切。)