web-dev-qa-db-ja.com

参照による配列の受け渡し

静的に割り当てられた配列を参照渡しする方法は?

void foo(int (&myArray)[100])
{
}

int main()
{
    int a[100];
    foo(a);
}

(&myArray)[100]は何らかの意味を持つのですか、それとも参照によって配列を渡すための単なる構文ですか?ここでは、大括弧が後に続くかっこを区別しません。ありがとう。

148
John DB

これは配列参照の構文です。(無効な)参照の配列(&array)ではなくint & array[100];を使用して、配列への参照が必要であることを明確にする必要があります。

編集:いくつかの説明。

void foo(int * x);
void foo(int x[100]);
void foo(int x[]);

これら3つは同じ関数を宣言する異なる方法です。それらはすべてint *パラメータを取るものとして扱われます、あなたはそれらに任意のサイズの配列を渡すことができます。

void foo(int (&x)[100]);

これは100個の整数の配列だけを受け付けます。 sizeofxを安全に使用できます

void foo(int & x[100]); // error

これは「参照の配列」として解析されます - これは合法ではありません。

195
Erik

それはちょうど必要な構文です:

void Func(int (&myArray)[100])

^ 100個のintの配列を参照で渡し、パラメータ名はmyArrayです。

void Func(int* myArray)

^配列を渡します。配列はポインタに崩壊します。したがって、あなたはサイズ情報を失います。

void Func(int (*myFunc)(double))

^関数ポインタを渡します。この関数はintを返し、doubleを取ります。パラメータ名はmyFuncです。

42
Martin York

それは構文です。関数の引数では、&myArrayを囲むint (&myArray)[100]括弧が必要です。使用しない場合はarray of referencesを渡すことになります。これはsubscript operator []& operatorよりも優先順位が高いためです。

例えば。 int &myArray[100] // array of references

そのため、type construction ()を使用することによって、100個の整数の配列への参照が必要であることをコンパイラに伝えます。

int (&myArray)[100] // reference of an array of 100 ints

20
cpx

配列はデフォルトでポインタによって渡されます。理解を深めるために、関数呼び出し内で配列を変更してみることができます。