重複の可能性:
関数の引数の型の後に *& が続く
私は今、他の人のコードを見ていて、異常な (少なくとも私にとっては) 関数宣言構文を見ました。次の C++ 構文は有効ですか?
bool Foo::Bar(Frame *&ptoframe, int msToBlock)
{
....
}
開発者は参照へのポインターを宣言しようとしていると思います。
助けてくれてありがとう
重複の可能性:
関数の引数の型の後に *& が続く
私は今、他の人のコードを見ていて、異常な (少なくとも私にとっては) 関数宣言構文を見ました。次の C++ 構文は有効ですか?
bool Foo::Bar(Frame *&ptoframe, int msToBlock)
{
....
}
開発者は参照へのポインターを宣言しようとしていると思います。
助けてくれてありがとう
はい、有効です。構文を右から左に読んでください。これは、ポインターへの参照を読み取ります。これは、関数に渡されるポインターを変更する場合に重要です。ポインターは、他のパラメーターと同様に参照によって効果的に渡されます。
ここにかなりの例があります:
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
) を使用して変更できることに注意してください。この構文は、実際のポインターにのみ適用され、ポイント先のオブジェクトには適用されません。
いいえ、最初の関数パラメーターはポインターへの参照です。他の人のポインターを変更したい場合があります... ウィット:
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);
}
これは、参照によって渡されるポインターです。これにより、呼び出し先は呼び出し元のポインターの値を変更できます。