如何在C中返回二维指针?

如何在C中返回二维指针?,c,pointers,C,Pointers,正如标题所示,如何像这样返回指针: xxxxxxx foo() { static int arr[5][5]; return arr; } 顺便说一句,我知道我必须至少指定一个维度的大小,但如何指定?使用typedef有助于: typedef int MyArrayType[][5]; MyArrayType * foo(void) { static int arr[5][5]; return &arr; // NB: return pointe

正如标题所示,如何像这样返回指针:

xxxxxxx foo() {

    static int arr[5][5];
    return arr;
}

顺便说一句,我知道我必须至少指定一个维度的大小,但如何指定?

使用typedef有助于:

typedef int MyArrayType[][5];

MyArrayType * foo(void)
{
    static int arr[5][5];
    return &arr;   // NB: return pointer to 2D array
}
如果您出于某种原因不想使用typedef,或者只是想知道上述函数的裸体版本会是什么样子,那么答案是:

int (*foo(void))[][5]
{
    static int arr[5][5];
    return &arr;
}

希望您能理解为什么在这种情况下使用typedef是一个好主意。

返回类型将是
int(*)[5]
(指向
int
的5元素数组的指针),如下所示

int (*foo(void))[5]
{
  static int arr[5][5];
  ...
  return arr;
}
它分解为

      foo             -- foo
      foo(    )       -- is a function
      foo(void)       --   taking no parameters
     *foo(void)       -- returning a pointer
    (*foo(void))[5]   --   to a 5-element array       
int (*foo(void))[5]   --   of int

请记住,在大多数上下文中,“T的N元素数组”类型的表达式转换为“指向T的指针”类型。表达式
arr
的类型是“5元素数组的
int
”的5元素数组,因此它被转换为“指向
int
的5元素数组的指针”,或
int(*)[5]

可能是
typedef int MyArrayType[5]取而代之?@ymfoi:好吧,可能有不止一种方法可以做到这一点——上面的解决方案适用于您的特定问题,但您可能试图做一些与您最初提出的不同的事情?是否要返回指向2D数组的指针?好的-我添加了一个上面没有typedef的版本-请不要这样编写代码!你需要注意C和C++之间的细微但重要的区别,它们在很多方面都是非常不同的语言,但是对于基本的POD类型,如上面的,那么你可以主要把它们看作是相似的。这是可怕的类型语法。我想我知道C。一个更好的问题是为什么你会想要返回一个。老实说,我想不出任何有意义的程序设计方式。@Lundin可能是一个返回2d数组指针的数据处理函数。这并不能解释为什么需要返回这样的指针,而不是使用作为函数参数之一传递的指针,这是C语言中的惯例。从函数返回指针通常清楚地表明程序设计不好。@Lundin你说得对。我知道使用该方法返回多个值非常方便。但我认为如果没有任何其他返回值,直接返回指针是很自然的。为什么这是一个糟糕的程序设计?你能详细解释一下吗?@Lundin很好。你的意思是返回值应该是一个错误代码而不是指针吗?谢谢你在C语法的残暴之上涂上了一层薄薄的理智。一旦你学会了基本规则,C声明语法实际上是相当简单的。丑陋,但直截了当。如果
(*a)[5]
是指向数组的指针,那么
(*f())[5]
是返回指向数组指针的函数。