如何在C语言中返回一个二维指针?

12

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

xxxxxxx foo() {

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

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


一个更好的问题是,为什么你想要返回一个值。我真的想不出任何一种程序设计方式会这样做有意义。 - Lundin
@Lundin 或许可以编写一个数据处理函数,该函数返回指向二维数组的指针。 - Determinant
@Lundin 没错,使用该方法返回多个值确实非常方便。但是我认为如果没有其他返回值,直接返回指针是很自然的选择。为什么这被认为是不好的程序设计?您能详细解释一下吗? - Determinant
@Lundin 嗯,你的意思是返回值应该是错误代码而不是指针吗? - Determinant
@Lundin 我知道你的意思。实际上,我只是在编写一个小程序,它是解决问题的算法实现。所以很清楚这个指针是用来干什么的。 - Determinant
显示剩余2条评论
2个回答

24
返回类型将是int (*)[5](指向包含5个int元素的数组的指针),如下所示。
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

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


3
谢谢您为这个丑陋的 C 语法涂上一层理智的薄膜。 - Prof. Falken
5
一旦你掌握了基本规则,C语言声明的语法实际上是相当简单的。虽然不太美观,但十分直接。如果 (*a)[5] 是指向数组的指针,那么 (*f())[5] 就是返回指向数组的指针的函数。 - John Bode
应该是 int (*foo(void))[5][5] 吧? - MustSeeMelons
1
@MustSeeMelons:如果我们返回&arr,那就是这种情况。但我们不是这样做的。表达式arr从类型为“5个元素的int数组的5个元素数组”衰减为“指向5个元素的int数组的指针”。 - John Bode

19

对此,使用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是一个好主意。


也许应该是typedef int MyArrayType[5];,对吗? - Determinant
@ymfoi:嗯,可能有不止一种方法可以做到这一点 - 上面的解决方案适用于您特定的问题,但也许您正在尝试做一些与最初提出的问题不同的事情?您是否想返回指向2D数组的指针? - Paul R
1
好的 - 我已经添加了一个没有typedef的版本 - 但请不要编写这样的代码! - Paul R
2
你需要注意C和C++之间微妙但重要的区别 - 在许多方面,它们是非常不同的语言,但对于基本的POD类型(如上文所述),你可以将它们大多数视为相似的。 - Paul R
1
那是可怕的类型语法。我以为我懂C。 - Prof. Falken
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接