【问题标题】:How to return a two-dimensional pointer in C?如何在 C 中返回二维指针?
【发布时间】:2012-05-29 07:31:24
【问题描述】:

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

xxxxxxx foo() {

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

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

【问题讨论】:

  • 一个更好的问题是为什么你想要返回一个。老实说,我想不出任何有意义的程序设计方式。
  • @Lundin 也许是一个数据处理函数,它返回一个指向二维数组的指针。
  • 这并不能解释为什么您需要返回这样一个指针,而不是使用作为函数参数之一传递的指针,这是 C 中的约定。从函数返回指针最常见一个糟糕的程序设计的明确指示。
  • @Lundin 你是对的。我知道使用该方法返回多个值非常方便。但是我认为如果没有任何其他返回值,直接返回一个指针是很自然的。为什么这是一个糟糕的程序设计?能详细解释一下吗?
  • @Lundin 很好。你的意思是返回值应该是错误码而不是指针?

标签: c pointers


【解决方案1】:

返回类型为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 的类型是“int 的 5 元素数组的 5 元素数组”,因此它被转换为“指向int 的 5 元素数组的指针”,即int (*)[5]

【讨论】:

  • 感谢您在这种 C 语法的残暴之上画上一层薄薄的理智。
  • 一旦您了解了基本规则,C 声明语法实际上是相当简单的。丑陋,但直截了当。如果(*a)[5] 是指向数组的指针,则(*f())[5] 是返回指向数组的指针的函数。
【解决方案2】:

为此使用 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];
  • @ymfoi:好吧,可能有不止一种方法可以做到这一点 - 上述解决方案适用于您的特定问题,但也许您正在尝试做一些与您最初提出的不同的事情?是否要返回指向二维数组的指针?
  • 好的 - 我在上面添加了一个没有 typedef 的版本 - 请不要写这样的代码!
  • 您需要了解 C 和 C++ 之间细微但重要的区别——它们在许多方面是非常不同的语言,但对于上述基本 POD 类型,您可以将它们视为类似。
  • 那是 HORRIBLE 类型的语法。我以为我认识 C。
猜你喜欢
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多