C ++で記述されたAPIを調べていますが、次のパラメータータイプの意味について混乱しています。
void*& data
これは、ユーザーがvoidポインターへの参照を渡すことを意味しますか?それが本当なら、ポイントは何ですか?つまり、void *はすでに間接化されているのに、なぜもう一度リダイレクトしたいのでしょうか。
C ++で記述されたAPIを調べていますが、次のパラメータータイプの意味について混乱しています。
void*& data
これは、ユーザーがvoidポインターへの参照を渡すことを意味しますか?それが本当なら、ポイントは何ですか?つまり、void *はすでに間接化されているのに、なぜもう一度リダイレクトしたいのでしょうか。
void *
C ++ではポインタ渡しを意味します。つまり、ポインタを渡すことを意味しますが、実際にはポインタのコピーです。アドレスを変更するなど、関数でこのポインターを変更した場合、渡したポインターには反映されません。
これを参照渡しと組み合わせるとvoid *&
、元のポインターのエイリアスをこの関数に渡すことになります。アドレスを変更するなど、変更した場合は、元のポインタに反映されます。
使用法を見ずに言うのは難しいですが、参照は間接的なレベルであると指摘します。それがポインタへのポインタだったら、それは奇妙だと思いますか?これらは非常に一般的です。実際、コマンドライン引数を受け入れてcharポインターへのポインターを取得するときに、これらを処理します。もう1つの例は、バケットを使用してハッシュマップを作成していて、バケットを開始したポインターにポインターを返すことができるようにしたい場合です。
重要なのは、複数レベルの間接参照が必要になる場合があるということです。ポインタと参照の混合は奇妙な場合があることは事実ですが、それには十分な理由があります。一般的な理由の1つは、C++コードがCAPIと対話する必要があることです。多くのPOSIXシステムコールでは、渡されてから変更されるvoidポインターが必要であるため、問題のC++関数がそのラッパーとして機能している可能性があります。
ただし、ローカルボイド*への参照を返さないように注意してください。このようなことをしないでください:
void*& f()
{
int* a=new int(10);
void* x=(void*)a;
return x;
}