4

重複の可能性:
関数の引数の型の後に *& が続く

私は今、他の人のコードを見ていて、異常な (少なくとも私にとっては) 関数宣言構文を見ました。次の C++ 構文は有効ですか?

bool Foo::Bar(Frame *&ptoframe, int msToBlock)
{
    ....
}

開発者は参照へのポインターを宣言しようとしていると思います。

助けてくれてありがとう

4

3 に答える 3

5

はい、有効です。構文を右から左に読んでください。これは、ポインターへの参照を読み取ります。これは、関数に渡されるポインターを変更する場合に重要です。ポインターは、他のパラメーターと同様に参照によって効果的に渡されます。

ここにかなりの例があります:

void no_change(int * ptr) {
    ptr = 0;
}

void change_ptr(int *& ptr) {
    ptr = 0;
}

int main() {

    int *x;

    change_ptr(x);

}

渡されたポインターの値はchange_ptr、参照によって渡されているため、変更されます。

ただし、ポインターが指すオブジェクトの値は、no_change関数 (つまり*ptr = new int) を使用して変更できることに注意してください。この構文は、実際のポインターにのみ適用され、ポイント先のオブジェクトには適用されません。

于 2012-12-18T22:23:19.833 に答える
4

いいえ、最初の関数パラメーターはポインターへの参照です。他の人のポインターを変更したい場合があります... ウィット:

void change_my_char(char & c)    { c = 'x';     }

void pimp_my_pointer(void * & p) { p = nullptr; }

int main() {
  char x;
  void * y;
  change_my_char(x);
  pimp_my_pointer(y);
}
于 2012-12-18T22:22:48.810 に答える
4

これは、参照によって渡されるポインターです。これにより、呼び出し先は呼び出し元のポインターの値を変更できます。

于 2012-12-18T22:23:25.520 に答える