函数原型返回C中的2D数组
我不是很擅长C,我真的很困惑双数组。下面是一段我有疑问的代码的概要。Main函数调用CreateRandConn函数,并将填充有0的2D数组作为参数传递给它。CreateRandConn函数将二维数组作为参数,将2DArray中的一些值从0更改为1,并将更改后的2DArray返回到main。我想在函数原型中指出CreateRandConn函数的返回类型是2D数组。我如何表明这一点?我不太懂语法。我写的是错的吗?我在函数头中将2DArray作为参数传递的方式是否不正确?如果是,我怎么写?我仍然对指针和双数组之间的关系感到困惑。有人能用下面的代码大纲解释一下吗?希望有人知道我的问题是什么函数原型返回C中的2D数组,c,pointers,multidimensional-array,function-prototypes,C,Pointers,Multidimensional Array,Function Prototypes,我不是很擅长C,我真的很困惑双数组。下面是一段我有疑问的代码的概要。Main函数调用CreateRandConn函数,并将填充有0的2D数组作为参数传递给它。CreateRandConn函数将二维数组作为参数,将2DArray中的一些值从0更改为1,并将更改后的2DArray返回到main。我想在函数原型中指出CreateRandConn函数的返回类型是2D数组。我如何表明这一点?我不太懂语法。我写的是错的吗?我在函数头中将2DArray作为参数传递的方式是否不正确?如果是,我怎么写?我仍然对指
//Function prototype
int ** CreateRandConn(char * RandRoom[7], int my2DArray[7][7], char * room_dir);
//Function
int ** CreateRandConn(char * RandRoom[7], int my2DArray[7][7], char * room_dir)
{
...
return my2DArray;
}
int main()
{
int 2DArray[7][7] = {0};
2DArray = CreateRandConn(RandRoomArray, my2DArray[7][7], room_dir);
return 0;
}
我不太懂语法
好的,让我们回顾一下基本知识:
T
的N
元素数组的指针p
定义为:T(*p)[N]
int 2DArray[7][7] = ...;
为了以下解释的清晰性,我将其更改为
int a[5][7] = ...;
所以这就被传递给一个函数。以下情况发生/适用时:
- 以下1。如上所述,不可能传递数组,就好像有可能将其分配给函数内的变量一样,因为不能分配数组,就不能传递数组
- 以下2。在上面,函数需要将相关变量定义为“指向数组第一个元素的指针”李>
- 以下三点。上面,
的第一个元素是a
int[7]
- 接下来的4。上面,指向
的指针将被定义为:int[7]
int(*)[7]
... func(int (*pa)[7])
pa
指向a
的第一个元素。作为旁注:从该指针a
函数无法导出a
实际“提供”的元素数,它会说:一个a
指向后面的有效元素数将随之出现,因此这也需要传递给函数:
... func(int (*pa)[7], size_t rows)
从到目前为止我们了解到的步骤中,数组没有被传递,但只传递了指向它的第一个元素*1的指针,它被复制到函数的局部变量中(pa
)
因此,数组不能作为函数的返回值传回,而只能作为指向数组元素的指针(通常是第一个)
查看指向数组的指针是如何定义的:T(*p)[N]
我们知道需要推导返回指向数组的指针的函数的外观。函数的挪用多少需要变成上面的p
。因此,将T
作为int
和N
作为7,我们得到:
int (*func(int (*pa)[7], size_t rows))[7];
然后,琐碎的实现和使用将是:
#include <stdlib.h> /* for size_t */
#define ROWS (5)
#define COLS (7)
int (*func(int (*pa)[COLS], size_t rows))[COLS];
int (*func(int (*pa)[COLS], size_t rows))[COLS]
{
for (size_t i = 0; i < rows; ++i)
{
for (size_t j = 0; j < COLS; ++j)
{
pa[i][j] = 0;
}
}
return pa;
}
int main(void)
{
int a[ROWS][COLS];
int (*pa)[COLS] = func(a, ROWS);
return EXIT_SUCCESS;
}
定义指向COLS
或int
s数组的类型
因此,使用PA
我们可以代替
int (*func(int (*pa)[COLS], size_t rows))[COLS];
写
此版本与上述版本相同
是的,它看起来更简单,但带来了一个事实,指针
pa
和函数的返回值)仅仅通过查看它们的定义是无法识别为指针的。这种构造被许多程序员同事认为是“糟糕的做法”。试试这个:CreateRandomConn(RandRoomArray,my2DArray,room\u dir)代码>这应该在社区wiki中标记,这样就可以方便地参考一个非常常见的问题的完整答案。干得好,谢谢你!这对理解多维数组非常有帮助!实际上,您可以指定一个数组。您不能将其分配给数组(但可以将其分配给指针)。例如,这很好:inta[5][7]={0};int(*pa)[7]=a代码>@SiggiSv:“无法分配给…”-这就是我想要表达的。修好了,谢谢你。仍然没有母语人士…:}
int (*func(int (*pa)[COLS], size_t rows))[COLS];
PA func(PA pa, size_t rows))[COLS];