Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数原型返回C中的2D数组_C_Pointers_Multidimensional Array_Function Prototypes - Fatal编程技术网

函数原型返回C中的2D数组

函数原型返回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作为参数传递的方式是否不正确?如果是,我怎么写?我仍然对指

我不是很擅长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;
}
我不太懂语法

好的,让我们回顾一下基本知识:

  • 不能为数组变量赋值
  • 如果数组被传递给函数,它将“衰减”到指向其第一个元素的指针
  • 多维数组就是数组的数组。二维阵列是一维阵列的一维阵列,三维阵列是二维阵列的一维阵列,4D阵列是三维阵列的一维阵列,依此类推
  • 指向类型为
    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];