11

タイトルが示すように、次のようにポインタを返す方法:

xxxxxxx foo() {

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

ところで。少なくとも 1 つの次元のサイズを指定する必要があることはわかっていますが、どのようにすればよいでしょうか?

4

2 に答える 2

21

戻り値の型は、次のように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].

于 2012-05-29T11:34:51.470 に答える
17

これには 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 を使用することがなぜ良い考えなのか、お分かりいただけたと思います。

于 2012-05-29T07:35:53.447 に答える