これは参照によって配列を渡すことを許可されていますか?
void foo(double& *bar)
私のコンパイラはノーと言っているようです。なんで?配列を参照渡しする適切な方法は何ですか? それとも回避策ですか?メソッドが変更し、後で取得する必要がある配列引数があります。または、この配列をクラス メンバーにすることもできます。これは正常に機能しますが、コードの他の部分に多くの欠点があります (回避したい)。
ありがとうございます。
これは参照によって配列を渡すことを許可されていますか?
void foo(double& *bar)
私のコンパイラはノーと言っているようです。なんで?配列を参照渡しする適切な方法は何ですか? それとも回避策ですか?メソッドが変更し、後で取得する必要がある配列引数があります。または、この配列をクラス メンバーにすることもできます。これは正常に機能しますが、コードの他の部分に多くの欠点があります (回避したい)。
ありがとうございます。
実際には、配列は参照によってのみ渡すことができます。
void foo(double (&bar)[10])
{
}
これにより、次のようなことができなくなります。
double arr[20];
foo(arr); // won't compile
任意のサイズの配列を に渡せるようにするにfoo
は、それをテンプレートにして、コンパイル時に配列のサイズを取得します。
template<typename T, size_t N>
void foo(T (&bar)[N])
{
// use N here
}
の使用を真剣に検討する必要std::vector
があります。または、c++11 をサポートするコンパイラがある場合は、std::array
.
はい。ただし、参照の引数が一致する場合、ポインタへの暗黙の配列は自動ではないため、次のようなものが必要です。
void foo( double (&array)[42] );
また
void foo( double (&array)[] );
ただし、double [42]
とdouble []
は異なるタイプであることに注意してください。未知の次元の配列がある場合、それは2番目に一致しますが、最初には一致しません。42個の要素を持つ配列がある場合、最初に一致しますが、2番目には一致しません。(後者は、私見ですが、非常に直感的ではありません。)
2番目のケースでは、関数内に入るとディメンションを復元する方法がないため、ディメンションも渡す必要があります。
C ++を使用しているため、ここでまだ欠落している必須の提案は、を使用することstd::vector<double>
です。
あなたはそれを参照によって簡単に渡すことができます:
void foo(std::vector<double>& bar) {}
また、C ++ 11をサポートしている場合は、もご覧くださいstd::array
。
参考のために:
要素だけを変更したい場合:
void foo(double *bar);
で十分です。
アドレスを (例: ) に変更したいがrealloc
、配列では機能しない場合:
void foo(double *&bar);
が正しい形です。
8.3.5.8 パラメーターの型に「T の境界が不明な配列へのポインター」または「T の境界が不明な配列への参照」という形式の型が含まれる場合、プログラムは不正な形式です
他の答えが言うように、の&
後に入れ*
ます。
これは、時には混乱を招く可能性がある興味深い点をもたらします: 型は右から左に読む必要があります。たとえば、これは (右端から*
) int への定数ポインターへのポインターです。
int * const *x;
したがって、あなたが書いたものは参照へのポインタになりますが、これは不可能です。