これを理解することは、1)戻り値と2)パラメータタイプの2つの部分に分けることができます。
int ( &fillarr() )[5] {
static int arr[5];
return arr;
}
タイプを見ることができます:int (&fillarr())[5]
。これを理解するために、残念ながら古いCルール:「宣言は式での使用法に似ています」は参照では機能しないため、代わりに同様の宣言を見てみましょう。
int (*fillarr())[5];
これは、サイズ5の配列への参照ではなく、ポインターを返す関数です。どうすればわかりますか?さて、intの配列へのポインタを返す関数があると仮定すると、5番目の要素にどのようにアクセスしますか?見てみましょう。最初に関数を呼び出す必要があります。次に、結果を逆参照してから、5番目の要素(存在しませんが、無視します)にアクセスする必要があります。これはまさに宣言構文です。f
f()
*f()
(*f())[5]
int
int x;
int (*f())[5];
x = (*f())[5];
// ^^^-------- call f -> yields pointer to array of 5 ints
// ^----------- dereferene the result of f -> yields array of 5 ints
// ^^^---- access the fifth element
これで、例で参照を返すため、*
をの代わりに使用するだけです。&
パラメータ構文も同様に機能します。