5

C ++で記述されたAPIを調べていますが、次のパラメータータイプの意味について混乱しています。

void*& data

これは、ユーザーがvoidポインターへの参照を渡すことを意味しますか?それが本当なら、ポイントは何ですか?つまり、void *はすでに間接化されているのに、なぜもう一度リダイレクトしたいのでしょうか。

4

3 に答える 3

7

void *C ++ではポインタ渡しを意味します。つまり、ポインタを渡すことを意味しますが、実際にはポインタのコピーです。アドレスを変更するなど、関数でこのポインターを変更した場合、渡したポインターには反映されません。

これを参照渡しと組み合わせるとvoid *&、元のポインターのエイリアスをこの関数に渡すことになります。アドレスを変更するなど、変更した場合は、元のポインタに反映されます。

于 2010-11-20T19:59:26.510 に答える
2

使用法を見ずに言うのは難しいですが、参照は間接的なレベルであると指摘します。それがポインタへのポインタだったら、それは奇妙だと思いますか?これらは非常に一般的です。実際、コマンドライン引数を受け入れてcharポインターへのポインターを取得するときに、これらを処理します。もう1つの例は、バケットを使用してハッシュマップを作成していて、バケットを開始したポインターにポインターを返すことができるようにしたい場合です。

重要なのは、複数レベルの間接参照が必要になる場合があるということです。ポインタと参照の混合は奇妙な場合があることは事実ですが、それには十分な理由があります。一般的な理由の1つは、C++コードがCAPIと対話する必要があることです。多くのPOSIXシステムコールでは、渡されてから変更されるvoidポインターが必要であるため、問題のC++関数がそのラッパーとして機能している可能性があります。

于 2010-11-20T20:03:17.823 に答える
1

ただし、ローカルボイド*への参照を返さないように注意してください。このようなことをしないでください:

void*& f()
{
 int* a=new int(10);
 void* x=(void*)a;
 return x;
}
于 2010-11-20T20:05:03.393 に答える