88

これは参照によって配列を渡すことを許可されていますか?

 void foo(double& *bar) 

私のコンパイラはノーと言っているようです。なんで?配列を参照渡しする適切な方法は何ですか? それとも回避策ですか?メソッドが変更し、後で取得する必要がある配列引数があります。または、この配列をクラス メンバーにすることもできます。これは正常に機能しますが、コードの他の部分に多くの欠点があります (回避したい)。

ありがとうございます。

4

7 に答える 7

152

実際には、配列は参照によってのみ渡すことができます。

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.

于 2012-04-04T09:27:13.173 に答える
18

はい。ただし、参照の引数が一致する場合、ポインタへの暗黙の配列は自動ではないため、次のようなものが必要です。

void foo( double (&array)[42] );

また

void foo( double (&array)[] );

ただし、double [42]double []は異なるタイプであることに注意してください。未知の次元の配列がある場合、それは2番目に一致しますが、最初には一致しません。42個の要素を持つ配列がある場合、最初に一致しますが、2番目には一致しません。(後者は、私見ですが、非常に直感的ではありません。)

2番目のケースでは、関数内に入るとディメンションを復元する方法がないため、ディメンションも渡す必要があります。

于 2012-04-04T09:25:19.307 に答える
8

C ++を使用しているため、ここでまだ欠落している必須の提案は、を使用することstd::vector<double>です。

あなたはそれを参照によって簡単に渡すことができます:

void foo(std::vector<double>& bar) {}

また、C ++ 11をサポートしている場合は、もご覧くださいstd::array

参考のために:

于 2012-04-04T09:12:58.730 に答える
6

要素だけを変更したい場合:

void foo(double *bar);

で十分です。

アドレスを (例: ) に変更したいがrealloc、配列では機能しない場合:

void foo(double *&bar);

が正しい形です。

于 2012-04-04T09:03:37.043 に答える
3

8.3.5.8 パラメーターの型に「T の境界が不明な配列へのポインター」または「T の境界が不明な配列への参照」という形式の型が含まれる場合、プログラムは不正な形式です

于 2014-07-18T15:05:16.780 に答える
2

他の答えが言うように、の&後に入れ*ます。

これは、時には混乱を招く可能性がある興味深い点をもたらします: 型は右から左に読む必要があります。たとえば、これは (右端から*) int への定数ポインターへのポインターです。

int * const *x;

したがって、あなたが書いたものは参照へのポインタになりますが、これは不可能です。

于 2012-04-04T09:07:22.567 に答える